主线程正在将任务加载到队列中。 工作线程正在处理这些任务。
我的代码是这样的:
//Core subclass a QThread
Core::AddTask()
{ ...
mutex.lock();
tasks.append(task);
mutex.unlock();
start();//which calls the run function
}
Core::RefreshTask()
{ ...
mutex.lock();
tasks.clear();
mutex.unlock();
// Calculate the new tasks...
...
//foreach newly added task call
AddTask();
}
Core::run()
{ ...
while (1)
{
finish = false;
mutex.lock();
tasks.dequeue();
if (tasks.size() == 0)
finish = true;
mutex.unlock();
...
if (finish)
break;
}
}
但是我发现工作线程未能完成所有任务,因为在处理run函数时,它不会响应start()调用。 然后在以下情况中:run函数正在处理最后一个任务,并且在调用AddTask的同时,它的start()调用将不执行任何操作。 run()函数完成并忽略该任务。
我知道信号/插槽机制可以解决问题。但我被迫使用旧的QThread :: run()样式多线程... 有关如何在Qt中正确编写生产者消费者模式的任何建议吗?
答案 0 :(得分:2)
我认为您不需要在start()
中致电Core::AddTask()
。将新任务添加到任务列表时,可以发送某种事件消息。它可以是Qt信号,条件变量或其他。
事件循环在单独的线程和进程任务中工作。如果任务列表为空,则事件循环等待事件。