Могу ли я использовать QTimer для реализации многопоточного алгоритма?
В настоящее время мне нужно реализовать многопоточный алгоритм на основе Qt. Может быть, я должен попытаться продлить QThread
, Но перед этим я хотел бы спросить, могу ли я просто использовать два QTimer
s timer1
, timer2
и подключить их сигнал тайм-аута к потокам соответственно, чтобы реализовать "фальшивую" многопоточную программу?
1 ответ
Вы можете подключить сигнал тайм-аут () QTimer
в соответствующие слоты, и позвоните start()
, С этого момента таймеры будут излучать сигналы timeout() с постоянными интервалами. Но два таймера запускаются в основном потоке и в главном цикле событий. Так что нельзя назвать это многопоточным. Потому что два слота не работают одновременно. Они запускаются один за другим, и если один из них блокирует основной поток, другой никогда не будет вызван.
Вы можете получить настоящее многопоточное приложение, имея несколько классов для разных задач, которые должны выполняться одновременно и использовать QObject::moveToThread
чтобы изменить сродство потока к объекту:
QThread *thread1 = new QThread();
QThread *thread2 = new QThread();
Task1 *task1 = new Task1();
Task2 *task2 = new Task2();
task1->moveToThread(thread1);
task2->moveToThread(thread2);
connect( thread1, SIGNAL(started()), task1, SLOT(doWork()) );
connect( task1, SIGNAL(workFinished()), thread1, SLOT(quit()) );
connect( thread2, SIGNAL(started()), task2, SLOT(doWork()) );
connect( task2, SIGNAL(workFinished()), thread2, SLOT(quit()) );
//automatically delete thread and task object when work is done:
connect( thread1, SIGNAL(finished()), task1, SLOT(deleteLater()) );
connect( thread1, SIGNAL(finished()), thread1, SLOT(deleteLater()) );
connect( thread2, SIGNAL(finished()), task2, SLOT(deleteLater()) );
connect( thread2, SIGNAL(finished()), thread2, SLOT(deleteLater()) );
thread1->start();
thread2->start();
Обратите внимание, что Task1
а также Task2
наследовать от QObject
,