C++ 如何从多个std::线程手动发送QSignal?

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

本质上,我正在尝试将QtGUI添加到已经存在的GLUT应用程序中,我不确定如何将现有代码中的信号传递到Qt中,而不引入生成几十个现有类QoObject的开销。目前,我正在使用一个QTimer和一个事件循环,但扩展性不是很好,似乎需要等待大量的互斥量,然后确定没有工作,试图解决这个耦合,而不是修复它

我能想到的最佳替代方案是:

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);
};