qt的消息循环(弱智问题)

herostarone 2011-01-17 10:10:43
以前学过MFC将近1年,知道消息循环,但是没有去深究,最近刚看QT,也有消息循环,我才发现,对MFC的也是似是而非。
我实现的功能就是文字的左移动
timer-》start(40);
while(!isok);
执行到这里的时候,time对应的函数却进不去了。
因为消息循环阻塞在这里了,也就是说timer的时间到了后,会把timeout这个消息放到消息循环里,但是本身这个while的对应的消息还没处理完,所以timeout那个消息就不会有机会得到执行。(不知道理解对不);

但是我有几点迷惑:
1.我只有一个qweight对象,假如我调用完timer-》start后,没有while,而是又执行了很长的代码,是否也会因为阻塞了timeout这个消息,导致定时器不工作呢?(也就是必须某个消息完全处理完毕后,下个消息才有机会执行,包括timer,所以timer才不准时)。
2.我们在main函数最后,有个return app。exec(),说是这个就是执行的消息循环,处理我们比如鼠标 键盘的事件,那么刚才timer这些是否也在这个消息循环里呢?
3.线程问题,那么开了线程后,是否每个线程都有自己的消息循环(这话应该不对),线程是靠CPU调度的。
4.假如说第一点成立,那么说定时器这不很不准了,我开了定时器后,还得等我本身空闲后(也就是timer-》start往后的代码都执行完了),定时器才能响应,岂不太没有效率了?不如用线程了?起码没有这么多限制?
5.我看了说主线程跟从线程通信,会产生阻塞?不理解,我开个线程,共享一个全局变量,怎么就阻塞主线程的消息队列了呢?
比如
int b;
thread a;
a。run()
b还不能在run里面用了吗?不会吧?
问题有点弱智也有点多,请多多包涵
我run
...全文
610 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
herostarone 2011-01-21
  • 打赏
  • 举报
回复
一个最基本的结构,就是main里面建立qweight,然后return app.exec。
qweight里,有一个UDP的信号曹,即
connect(&udpsocket,SIGNAL(readyRead()),this,SLOT(Handle()));
还有一个定时器,即:

connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
然后是两个对应的槽:
void DTL_LED::Handle()
{
。。。
timer->start(SPEED_BASE);
}
void DTL_LED::timerUpDate(void)
{
。。。
}
我想知道就是如果我收到一个udp后,进入handle,然后定时器开始执行,定时器还没执行完毕后,又来了一个udp信号,现在会如何处理呢?


[Quote=引用 1 楼 yangglemu 的回复:]
问题有点多,有的理解是对的,比如对Timer,确实会受到许多干扰,所以有些系统比如Windows提供了原子级的计时功能,好象是0.02微秒,具体不记得了,因为我们这样的人基本用不到,有点误差的Timer就够用了,现在CPU这么快,基本不用去关心这点误差

关于事件循环,在a.exe()后,主事件循环就启动了,事件管理器从操作系统接受如鼠标键盘重绘=消息,分发给相关的部件处理,有可能会过滤掉一些……
[/Quote]
  • 打赏
  • 举报
回复
问题有点多,有的理解是对的,比如对Timer,确实会受到许多干扰,所以有些系统比如Windows提供了原子级的计时功能,好象是0.02微秒,具体不记得了,因为我们这样的人基本用不到,有点误差的Timer就够用了,现在CPU这么快,基本不用去关心这点误差

关于事件循环,在a.exe()后,主事件循环就启动了,事件管理器从操作系统接受如鼠标键盘重绘=消息,分发给相关的部件处理,有可能会过滤掉一些过时没用的消息,有些线程可以执行自己的局部消息循环,如在QThread.run()中执行exec(),主从线程访问共享的变量是没问题的,和其它框架一样,注意下线程同步就可以了
另外,在长循环中使用processEvents()函数,会强制先处理消息队列中的消息,这会让循环挂起,直到消息队伍中的消息处理完毕再继续,

CPU在某个时间段虽然只能执行一条指令,但这个过程是非常快的,根本不用去关心你所谓的阻塞

在QT中, 强调信号和槽的概念,(类似于.Net中的delete/event),而事件在QT中是比较底层的概念,一般要通过继承重写相关保护函数(就是MFC中的OnPaint=)来处理特定事件,主要是由操作系统发送过来的如键盘鼠标重绘=消息

herostarone 2011-01-18
  • 打赏
  • 举报
回复

我有一个问题是:
timer->start(40);
while(!isoutofrange)
{
QApplication::processEvents();
}
isoutofrange=0;

上面这段在一个show里面执行,现在就是一行文字正在屏幕上滚动,
如果现在我又接受到了udp的消息,让我把另外的文字放也滚动,因为processEvents,我的UDP会接受到消息,按你的意思,processEvents会让消息队列的消息执行完,那么现在的话,是不是先执行完第二条命令,再执行刚才第一条的名命令呢?
而且接受到的数据的执行路径是一样的,会不会冲突呢?
[Quote=引用 1 楼 yangglemu 的回复:]
问题有点多,有的理解是对的,比如对Timer,确实会受到许多干扰,所以有些系统比如Windows提供了原子级的计时功能,好象是0.02微秒,具体不记得了,因为我们这样的人基本用不到,有点误差的Timer就够用了,现在CPU这么快,基本不用去关心这点误差

关于事件循环,在a.exe()后,主事件循环就启动了,事件管理器从操作系统接受如鼠标键盘重绘=消息,分发给相关的部件处理,有可能会过滤掉一些……
[/Quote]

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧