Вызов Qt Signal из второго потока работает -> не влияет на подключенный слот - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть Qt-приложение.Один из моих классов ViewSimulation имеет статический метод loggingHandler, который вызывает (испускает) класс-сигнал logging.Метод loggingHandler будет передан как указатель на функцию в c-файл publisher.c.publisher.c вызывает свой указатель функции (*logger) в отдельном потоке.

При отладке я вижу publisher.c звонки ViewSimulation::loggingHandler и сигналы logging испускаются, но подключенный слот не реагирует.Но если вызов / выброс logging в основном потоке, слот &ViewGooseList::logging) среагирует.

Почему слот не реагирует на "вызов" от другого c-thread in publisher.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 / h

/*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);
...

1 Ответ

2 голосов
/ 09 апреля 2019

Для соединений сигнал / слот между потоками, вы должны создать соединения в очереди:

connect(m_gooseSimulation, &ViewSimulation::logging, m_gooseList,
        &ViewGooseList::logging, Qt::QueuedConnection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...