Могу ли я использовать QTimer для реализации многопоточного алгоритма?

В настоящее время мне нужно реализовать многопоточный алгоритм на основе Qt. Может быть, я должен попытаться продлить QThread, Но перед этим я хотел бы спросить, могу ли я просто использовать два QTimers 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,

Другие вопросы по тегам