我在使用 qt 同步多个线程时遇到问题(不幸的是 3.3.8)。因为启动线程是一项耗时的任务,所以我想启动一个(工作)线程一次,将其保留在其运行方法中并通知它有关新工作的信息。但是当所有工作完成后,我还需要在调用线程中同步这些工作线程。
我知道 QThread 的重载不是正确使用它,但是在 Qt 3.3.8 中没有 moveToThread-Method ,所以我必须这样做。
工作线程类定义如下(简化)
class WorkerThread : public QThread
{
private:
QWaitCondition m_wcNewWork;
QMutex m_mutexStopped;
bool m_bStopped; /// Stop thread execution
void run()
{
m_mutexStopped.lock();
while(!m_bStopped)
{
m_mutexStopped.unlock();
m_wcNewWork.wait(); //wait for new work
msleep(1000); // do something
//>notify main thread that the work is done<
m_mutexStopped.lock();
}
m_mutexStopped.unlock();
}
public:
WorkerThread() : m_bStopped(false) {}
~WorkerThread()
{
m_mutexStopped.lock();
m_bStopped = true;
m_mutexStopped.unlock();
wait(); // Wait for thread
//Cleanup
}
void startProcessing()
{
m_wcNewWork.wakeOne(); /// Wakeup thread, since there is something to do
}
}
一堆这样的工作线程是在另一个线程中创建的。我们称之为MainThread。现在我需要一些东西来通知 MainThread 所有工作线程都已完成工作。我认为 MainThread 中的 WaitConditions 可以解决问题,每个 WorkerThread 都有一个。然后在 MainThread 我写了类似的东西
QWaitCondition waitWorkDone[numWorker];
//Start working
for (int i = 0; i < numWorker; i++)
{
WorkerThread[i].setWaitCondition(waitWorkDone);
WorkerThread[i].startProcessing();
}
//Wait for all workers to finish their work
for (int i = 0; i < numWorker; i++)
{
waitWorkDone[i].wait();
}
在 WorkerThread::run-method 中,我使用 awaitWorkDone.wakeOne()
通知 MainThread 工作已完成。不幸的是,这不起作用。当 waitWorkDone 在等待之前被唤醒时,MainThread 将永远等待。
所以问题是:我如何同步不离开运行方法的线程?我认为在 Qt 4 中我可以使用线程池来执行此操作,但它们在 Qt 3 中不存在。
提前致谢。