代码之家  ›  专栏  ›  技术社区  ›  suszterpatt

QThread::sleep()是否需要运行事件循环?

  •  1
  • suszterpatt  · 技术社区  · 15 年前

    我有一个用Qt编写的简单客户机-服务器程序,其中进程使用MPI进行通信。我尝试实现的基本设计如下:

    1. QMainWindow ),侦听来自客户端的消息(使用repeat fire) QTimer

    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() 对日志文件有两次写入的调用,只执行第一次,控制永远不会到达第二次)。这是因为我没有启动事件循环吗?如果是这样,实现所需功能的最简单方法是什么?

    2 回复  |  直到 15 年前
        1
  •  0
  •   zoli2k    15 年前

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

        2
  •  0
  •   Chadwick Robbert    10 年前

    对这个问题的一个简单的回答是:睡眠和事件循环没有关系。 Sleep使调用线程休眠,而不管它是否从线程的 run() 功能或任何其他功能。没什么区别,也逃不掉。 事实上,如果 exec() 运行()

    第二条日志语句未被写入的原因与 sleep() 如果记录器对象是本地的或对 一直在工作。控件必须在指定的睡眠时间完成后返回线程。但同时,线程可能会失去对传入连接等瞬态对象的控制。

    sleep msleep usleep 是公共静态函数。