从第二个线程调用Qt信号 - >对连接的插槽没有影响

问题描述 投票:0回答:1

我有一个Qt应用程序。我的一个类ViewSimulation有一个静态Methode loggingHandler,它调用(发射)类信号logging。方法loggingHandler将作为函数指针传递给c文件publisher.cpublisher.c在一个单独的线程中调用他的函数指针(*logger)

在调试中,我看到publisher.c调用ViewSimulation::loggingHandler并且信号logging被激活,但连接的插槽没有反应。但是如果在主线程中调用/发出logging,则&ViewGooseList::logging)的插槽会做出反应。

为什么插槽没有通过publisher.c中的另一个c线程“调用”来做出反应?

ViewSimulation.cpp / h

class ViewSimulation : public QGroupBox
{
...
    signals:
          void logging(int id, uint64_t timestamp);
    private:
          static void loggingHandler(int id, uint64_t timestamp);
    ViewSimulation* ViewSimulation::m_current;
...
    void ViewSimulation::loggingHandler(int id, uint64_t timestamp)
    {
          emit ViewSimulation::m_current->logging(id, timestamp);
    }
...
    connect(m_gooseSimulation, &ViewSimulation::logging, m_gooseList, &ViewGooseList::logging);
    setLogging(loggingHandler);

publisher.c /小时

/*Header*/
void setLogging(void (*logging)(int, uint64_t));
static void (*logger)(int gooseId, uint64_t timestamp);

/*C-File*/
void setLogging(void (*logging)(int, uint64_t))
{
    logger = logging;
}
...
/*This methode will be called from main-thread **AND** from second thread */
logger(gooseMessage->id, gooseMessage->lastTimeStamp);
...
c++ c multithreading qt
1个回答
2
投票

对于跨线程的信号/插槽连接,您应该创建排队连接:

connect(m_gooseSimulation, &ViewSimulation::logging, m_gooseList,
        &ViewGooseList::logging, Qt::QueuedConnection);
© www.soinside.com 2019 - 2024. All rights reserved.