Как запустить Qt UI и поток приема очереди сообщений Linux в parellel? - PullRequest
1 голос
/ 03 марта 2020

Я разрабатываю пользовательский интерфейс, используя QTCreator, используя CPP. Мое требование - запустить пользовательский интерфейс, и мне нужно постоянно опрашивать linux очередь сообщений, используя функцию msgrcv(), поступают ли какие-либо данные в очередь. Я создал один поток, чтобы непрерывно контролировать сообщение очереди приема. При запуске и запуске упомянутого потока пользовательский интерфейс застрял. Любое решение для параллельного запуска потока и пользовательского интерфейса?

1 Ответ

1 голос
/ 03 марта 2020

Невозможно сказать, не увидев ваш код. Однако, если операция 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 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...