Невозможно сказать, не увидев ваш код. Однако, если операция poll неблокирующая, вам не нужен поток. Вместо этого вы можете зарегистрировать фрагмент кода, который будет запускаться событием Qt l oop в каждой итерации пользовательского интерфейса l oop. Вы делаете это с помощью QTimer 0 мс:
void poll_function();
// ...
QTimer poll_timer;
QObject::connect(&poll_timer, &QTimer::timeout, poll_function);
poll_timer.start();
Конечно, в приведенном выше примере кода poll_function()
перестанет вызываться, когда poll_timer
выйдет из области видимости. В вашем реальном коде вы должны использовать QTimer
, который остается в живых до тех пор, пока он вам нужен. Вероятно, он должен быть членом данных вашего подкласса QApplication
.
Если блокирует poll_function()
, тогда этот подход не будет работать, поскольку он будет блокировать пользовательский интерфейс. Поэтому вы должны сказать msgrcv()
не блокировать. На справочной странице :
Если сообщения запрошенного типа недоступны и IPC_NOWAIT не указан в msgflg, вызывающий процесс блокируется
Поэтому убедитесь, что вы включили IPC_NOWAIT
в msgflg
флаги при вызове msgrcv()
.
Если опрос по каждому событию пользовательского интерфейса l oop итерации слишком много накладных расходов, тогда вы можете вместо этого установить обычный интервал ожидания в миллисекундах:
poll_timer.setInterval(500);
Это будет вызывать вашу функцию опроса каждые 500 мс.