我将一部分现有代码导入到我的Qt应用程序中,并注意到其中有一个睡眠功能.我看到这种类型的函数在事件编程中没有地位.我该怎么做呢?
更新:经过思考和反馈我会说答案是:只在GUI主线程外调用sleep,如果你需要在GUI线程中等待使用processEvents()或事件循环,这将阻止GUI冻结.
它不漂亮,但我在Qt邮件列表档案中找到了这个:
QThread的sleep方法受到保护,但您可以像这样公开它:
class SleeperThread : public QThread { public: static void msleep(unsigned long msecs) { QThread::msleep(msecs); } };
然后打电话:
SleeperThread::msleep(1000);
从任何线程.
但是,更优雅的解决方案是重构代码以使用QTimer - 这可能需要您保存状态,以便在计时器关闭时知道该怎么做.
我不建议在基于事件的系统中进行睡眠,但是如果你想...
你可以使用等待条件,这样你就可以在必要时中断睡眠.
//... QMutex dummy; dummy.lock(); QWaitCondition waitCondition; waitCondition.wait(&dummy, waitTime); //...
睡眠在基于事件的编程中是一个坏主意的原因是因为基于事件的编程实际上是非抢占式多任务处理的一种形式.通过调用sleep,可以防止任何其他事件变为活动状态,从而阻止线程的处理.
在udp数据包的请求响应方案中,发送请求并立即等待响应.Qt具有良好的套接字API,可确保套接字在等待事件时不会阻塞.事件将在它到来时发生.在你的情况下,QSocket :: readReady信号是你的朋友.
如果您想在将来的某个时间点安排活动,请使用QTimer.这将确保不阻止其他事件.