2010-04-03 611 views
1

我有一个用Qt编写的简单的客户端服务器程序,其中进程使用MPI进行通信。我想实现的基本设计如下:QThread :: sleep()是否需要事件循环才能运行?

  1. 第一个进程(“服务器”)启动一个GUI(从QMainWindow派生),它监听来自客户端的消息(使用重复火QTimer s和异步MPI接收呼叫),根据接收到的消息更新GUI,并向每条消息发送回复。

  2. 每个其他进程(“客户端”)都运行在一个无限循环中,他们所要做的就是发送消息到服务器进程,接收回复,休眠一段时间,然后唤醒并重复。每个进程实例化从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()调用两次写入日志文件,只执行第一个,控制永远不会到达第二个)。这是因为我没有启动事件循环?如果是这样,实现所需功能的最简单方法是什么?

回答

0

客户端代码中的某些类可能需要启动事件循环。如果客户端没有事件循环并且您已经在使用MPI,为什么要为客户端使用QThreads?

+0

我从客户端'QThread'派生的唯一原因是因为它使我通过'QThread :: sleep()'方便地访问睡眠功能。我想避免忙等待。 – suszterpatt 2010-04-03 11:27:37

+0

执行不一定是bussy等待,从我的愿望看,它不是,有更聪明的东西在后面(或者你的CPU实际上将所有的时间100%) 所以去执行和信号插槽的概念 – drahnr 2010-04-03 17:52:51

+0

我知道' exec()'不是在忙等待,我的意思是我想避免等待,例如,启动一个计时器,然后在代码中放入'while(timer.isActive()){}'。'QThread :: sleep()'是我能找到的最方便的解决方案。 – suszterpatt 2010-04-04 16:39:36

0

一个问题的答案是 - 睡眠和事件循环不相关。 睡眠使调用线程处于睡眠状态,而不管它是否从线程的重写run()函数或任何其他函数调用。它没有区别,也没有逃脱。 事实上,如果exec()被调用run()(其中QThread的默认实现是)的某处,控件将不会返回给调用者。

如果记录器对象始终为本地或可用于run()函数,则第二条日志语句未写入的原因不能与sleep()直接相关。在指定量的睡眠完成后,控制器必须返回到线程。但是与此同时,该线程可能会失去对传入连接等瞬态对象的控制。

也许当问这个问题QThread :: sleep()是一个私有函数。现在使用Qt 5,sleepmsleep或甚至是usleep是公共静态函数。

相关问题