我有一个用Qt编写的简单的客户端服务器程序,其中进程使用MPI进行通信。我想实现的基本设计如下:QThread :: sleep()是否需要事件循环才能运行?
第一个进程(“服务器”)启动一个GUI(从
QMainWindow
派生),它监听来自客户端的消息(使用重复火QTimer
s和异步MPI接收呼叫),根据接收到的消息更新GUI,并向每条消息发送回复。每个其他进程(“客户端”)都运行在一个无限循环中,他们所要做的就是发送消息到服务器进程,接收回复,休眠一段时间,然后唤醒并重复。每个进程实例化从
QThread
派生的单个对象,并调用其方法start()
。这些类的run()
方法都这个样子:
从Foo.cpp中:
void Foo::run()
{
while (true)
{
// Send message to the first process
// Wait for a reply
// Do uninteresting stuff with the reply
sleep(3); // also tried QThread::sleep(3)
}
}
在客户端的代码,有一个exec()
任何地方没有呼叫,所以没有事件循环应该开始。
问题是,客户端永远不会从睡眠中醒来(如果我围绕sleep()
调用两次写入日志文件,只执行第一个,控制永远不会到达第二个)。这是因为我没有启动事件循环?如果是这样,实现所需功能的最简单方法是什么?
我从客户端'QThread'派生的唯一原因是因为它使我通过'QThread :: sleep()'方便地访问睡眠功能。我想避免忙等待。 – suszterpatt 2010-04-03 11:27:37
执行不一定是bussy等待,从我的愿望看,它不是,有更聪明的东西在后面(或者你的CPU实际上将所有的时间100%) 所以去执行和信号插槽的概念 – drahnr 2010-04-03 17:52:51
我知道' exec()'不是在忙等待,我的意思是我想避免等待,例如,启动一个计时器,然后在代码中放入'while(timer.isActive()){}'。'QThread :: sleep()'是我能找到的最方便的解决方案。 – suszterpatt 2010-04-04 16:39:36