目前我需要实现一个基于Qt的多线程算法。也许我应该尝试扩展QThread
。
但在此之前,我想问一下,如果我可以使用两个QTimer
s timer1
,timer2
,并将其超时信号分别连接到线程,以实现"假"多线程程序?
答案 0 :(得分:3)
您可以将QTimer
的timeout()信号连接到相应的广告位,然后拨打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
。