C++ 如何从多个std::线程手动发送QSignal?
本质上,我正在尝试将QtGUI添加到已经存在的GLUT应用程序中,我不确定如何将现有代码中的信号传递到Qt中,而不引入生成几十个现有类QoObject的开销。目前,我正在使用一个QTimer和一个事件循环,但扩展性不是很好,似乎需要等待大量的互斥量,然后确定没有工作,试图解决这个耦合,而不是修复它 我能想到的最佳替代方案是:C++ 如何从多个std::线程手动发送QSignal?,c++,multithreading,qt,C++,Multithreading,Qt,本质上,我正在尝试将QtGUI添加到已经存在的GLUT应用程序中,我不确定如何将现有代码中的信号传递到Qt中,而不引入生成几十个现有类QoObject的开销。目前,我正在使用一个QTimer和一个事件循环,但扩展性不是很好,似乎需要等待大量的互斥量,然后确定没有工作,试图解决这个耦合,而不是修复它 我能想到的最佳替代方案是: static std::mutex relay_mutex; static std::condition_variable relay_condition; static
static std::mutex relay_mutex;
static std::condition_variable relay_condition;
static std::queue<std::pair<int, void*> > relay_queue;
extern "C"
void passMessage(int a, void * b)
{
std::lock_guard<std::mutex> lock(relay_mutex);
relay_queue.emplace_back(a, b);
relay_condition.notify_all();
}
class RelayThread : public QThread
{
Q_OBJECT
public:
RelayThread() {}
signals:
void passMessage(int, void *);
protected:
void run() override
{
std::unique_lock<std::mutex> lock(relay_mutex);
for(;;)
{
while(relay_queue.empty())
relay_condition.wait();
do {
emit passMessage(relay_queue.front().first, relay_queue.front().second);
if(relay_queue.front().first == 0)
return;
relay_queue.pop()
} while(relay_queue.size());
}
}
};
但这显然会导致额外的上下文切换开销,这也不好。有没有一种方法可以在不通过QThread的情况下手动对信号排队?这就足够了。如果需要,可以通过将连接类型设置为调用的第三个参数的值,让Qt进行排队
您还需要为MessageType注册一个元类型。请参阅。签出调用函数,您可以在不使用信号的情况下调用插槽。@Anže谢谢!看起来不错。。
#include <QObject>
void passMessage(int a, MessageType b) {
Relay r(a,b);
}
class Relay: public QObject {
Q_OBJECT
public:
Relay(int a, MessageType b) {
emit passMessage(a, b);
}
signals:
void passMessage(int, MessageType);
};