我有一个连接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有替代方案吗?
(对不起我的英文)
答案 0 :(得分:1)
Qt思维模式大部分时间都处理事件,Qt事件循环将为您执行等待/暂停。虽然select
(Linux上的pselect
)完全符合您的要求但它不是Qt方式。
这样做的Qt方式可能是连接接收到的新帧和发生超时的两个信号。如果您的对象是在UDP线程中创建的,则它们的插槽将在同一个线程中执行(doc about this)。
您可以在run
功能中进行初始化并创建+将信号连接到某个自定义广告位,然后拨打forever
,而不是拨打exec()
,run
{{3} })。 exit()
函数不会返回,因此不会终止您的线程,但会等待事件,直到您通过调用ListView
自行终止线程。你可以在收到你想要的东西时自己调用它,或者从主线程中调用它来在某个时刻停止处理帧。
然后你需要一个自定义插槽来处理新帧并重置QTimer以从0重新启动超时。并最终另一个自定义插槽来处理超时,或者相同的插槽取决于发生时你必须做什么。 / p>
现在你可以看到你的代码没有阻塞,所以你可以直接在主线程中完成所有这些,除非数据处理很长。