超时时暂停线程

时间:2016-04-18 07:33:41

标签: c++ qt udp nonblocking qthread

我有一个连接UDP的线程。

我希望在超时时暂停我的线程(或者我的QStack中没有存储UDP帧的新帧)。

run(){

    forever{
         QTimer *timer_nb = new QTimer();
         timer_nb->start(500);

         // --- Wait for timeout or new frames in my QStack
         //then ....
    }
}

我找到了一个函数select(),但我真的不明白它是如何工作的...... Qt有替代方案吗?

(对不起我的英文)

1 个答案:

答案 0 :(得分:1)

Qt思维模式大部分时间都处理事件,Qt事件循环将为您执行等待/暂停。虽然select(Linux上的pselect)完全符合您的要求但它不是Qt方式。

这样做的Qt方式可能是连接接收到的新帧发生超时的两个信号。如果您的对象是在UDP线程中创建的,则它们的插槽将在同一个线程中执行(doc about this)。

您可以在run功能中进行初始化并创建+将信号连接到某个自定义广告位,然后拨打forever,而不是拨打exec()run {{3} })。 exit()函数不会返回,因此不会终止您的线程,但会等待事件,直到您通过调用ListView自行终止线程。你可以在收到你想要的东西时自己调用它,或者从主线程中调用它来在某个时刻停止处理帧。

然后你需要一个自定义插槽来处理新帧并重置QTimer以从0重新启动超时。并最终另一个自定义插槽来处理超时,或者相同的插槽取决于发生时你必须做什么。 / p>

现在你可以看到你的代码没有阻塞,所以你可以直接在主线程中完成所有这些,除非数据处理很长。