2013-07-07 3 views
3

Мне нужно сделать бесконечный цикл работы в потоке. В this article автор пишет, чтоЦикл событий QThread и бесконечный рабочий цикл

>you should never ever block the event loop 

, потому что он будет блокировать сигнал концепции слота. Как я могу использовать цикл событий плюс бесконечный цикл в QThread?

+0

«Он блокирует концепцию сигнального слота» на самом деле не разбирается. Во всяком случае, я написал, почему это плохая идея чуть ниже, и это не имеет ничего общего с потоковой обработкой: «Когда деловая доставка застряла, виджеты не будут обновляться, дальнейшее взаимодействие с виджетами не возможно, таймеры не будут запускать и создавать сети коммуникация будет замедляться и останавливаться. Более того, многие оконные менеджеры обнаружат, что ваше приложение больше не обрабатывает события и сообщает пользователю, что ваше приложение не отвечает ». В вашем случае это просто означает, что ваш поток не будет отправлять события для объектов, живущих в этом потоке. – peppe

ответ

0

Вызов QCoreApplication::processEvents должен работать, но, возможно, лучшим решением является использование QThreadPool вместо того, чтобы заставить поток продолжать работать.

1

QThread - это «контроллер» потока. Его цикл событий не блокируется только потому, что ваш QObject выполняет бесконечный цикл. Если, конечно, вы не реализуете этот бесконечный цикл в подклассе QThread.

В вашем случае вам не обязательно это делать. Вместо этого просто реализуйте свой бесконечный цикл в подклассе QObject, а затем переместите этот объект QObject в поток с помощью QObject::moveToThread(). Таким образом, ваш бесконечный цикл не блокирует цикл событий QThread.

И, как всегда: the canonical article on how to really use QThread.

+1

Как правильно приостановить/возобновить поток, не блокируя цикл событий? – user14416

3

Петля всегда можно заменить на функцию, которая вызывается несколько раз (хотя это не всегда удобно). Создайте слот и подключите к нему QTimer. Пусть функция выполняет итерацию работы.

timer = new QTimer(); 
connect(timer, SIGNAL(timeout()), this, SLOT(iteration())); 
timer->start(50); 

void MyClass::iteration() { 
    if (!timer->isActive()) { return; } 
    //do something 
} 

Если вы хотите остановить цикл, позвоните по телефону timer->stop().

Смежные вопросы