开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

12
返回列表 发新帖
楼主: 十氵
收起左侧

[已解决] 最简单的时钟问题

 关闭 [复制链接]
结帖率:100% (2/2)
发表于 2025-3-27 02:19:03 | 显示全部楼层   辽宁省丹东市
十氵 发表于 2025-3-27 02:16
大大,我是想看时钟是不是异步,为什么会堵UI但能执行按钮

是异步,但是不是真正的异步 没跑完的前提下 再次执行 估计就崩了

补充内容 (2025-3-27 02:19):
所以说时钟里 不能放这种延时类的代码

补充内容 (2025-3-27 02:26):
延时长于时钟周期,会几个线程一起运行, 然后就。。
回复

使用道具 举报

签到天数: 19 天

发表于 2025-3-27 02:45:02 | 显示全部楼层   河北省张家口市
我回来了宝宝,专门为你查阅的资料,我说的不准确嗷,很可能不对
异步是什么呢?
我举个例子,我有个朋友,他今天早上要给女神小美和她的男友小帅做早餐,小美要煎饼果子不吃香菜。小帅要吃肾宝片夹韭菜
而他想给小帅的里面加点料……(不可描述.jpg)
于是他先去了煎饼果子摊上定了一份不吃香菜,然后跑到了药店让店员制作肾宝片夹韭菜,然后他自己去整秘制调料了,等摊主和店员通知他做好了,他才带着加料的食物去女神面前献殷勤
在这一系列过程中,线程一直是我这位朋友一个人。线程代码依次执行  煎饼→肾宝→整料→通知完成→程序完成


点评

换行呢怎么就发出来,稍等   河北省张家口市  发表于 2025-3-27 02:45
回复

使用道具 举报

发表于 2025-3-27 03:02:12 | 显示全部楼层   四川省眉山市
回复

使用道具 举报

签到天数: 19 天

发表于 2025-3-27 03:06:58 | 显示全部楼层   河北省张家口市
萧楚楠 发表于 2025-3-27 03:02
我回来了宝宝,专门为你查阅的资料,我说的不准确嗷,很可能不对
异步是什么呢?
我举个例子,我有个朋友, ...

@算法艺术家 @是可可吖 @小彬QQ649871230 大佬们我这个小美和小帅的例子是不是很生动形象具体

点评

66666   广东省江门市  发表于 2025-3-27 03:52
回复

使用道具 举报

结帖率:75% (3/4)

签到天数: 18 天

发表于 2025-3-27 04:33:00 | 显示全部楼层   江苏省镇江市
可以把 延迟 换成精易模块里的看看
回复

使用道具 举报

签到天数: 11 天

发表于 2025-3-27 10:37:52 | 显示全部楼层   河南省郑州市
看不懂,但支持学习!
回复

使用道具 举报

结帖率:43% (3/7)

签到天数: 16 天

发表于 2025-3-27 14:28:42 | 显示全部楼层   江西省九江市
时钟(Timer)是依附于 Windows消息队列,创建时钟后。
程序执行到消息循环处
[C++] 纯文本查看 复制代码
 
MSG msg = {0};
    while (GetMessage(&msg, 0, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

AI解释如下


如果你使用的是以下标准的消息循环:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

并且你通过 SetTimer 创建了一个定时器,但没有关联窗口(SetTimer 的第一个参数为 NULL),那么定时器的回调函数 TimerProc 的调用情况会有所不同。

调用栈和流程

  1. 创建定时器

    SetTimer(NULL, nIDEvent, uElapse, TimerProc);
    • 这里没有关联窗口(NULL),但指定了回调函数 TimerProc
  2. 定时器到期

    • 当定时器到期时,系统会生成一个 WM_TIMER 消息,并将其放入调用线程的消息队列中。
  3. 消息循环

    • 在消息循环中,GetMessage 会从消息队列中检索消息。
    • 如果检索到的消息是 WM_TIMERGetMessage 会将其返回给消息循环。
  4. DispatchMessage 的作用

    • DispatchMessage 被调用时,它会根据消息的类型和目标窗口(如果有的话)来处理消息。
    • 对于 WM_TIMER 消息,如果 SetTimer 时指定了回调函数 TimerProcDispatchMessage 会调用这个回调函数。

谁调用了 TimerProc

在这种情况下,TimerProc 是由 DispatchMessage 调用的。具体来说:

  • GetMessage 检索到 WM_TIMER 消息时,它会将该消息传递给 DispatchMessage
  • DispatchMessage 会检查消息类型,并根据消息的类型和目标窗口(如果有的话)来处理消息。
  • 对于 WM_TIMER 消息,如果在 SetTimer 时指定了回调函数 TimerProcDispatchMessage 会调用这个回调函数。

为什么 DispatchMessage 会调用 TimerProc

  • 这是因为 SetTimer 函数在内部将回调函数 TimerProc 与定时器关联起来。
  • DispatchMessage 处理 WM_TIMER 消息时,它会检查定时器的设置,并调用与之关联的回调函数。

总结

在没有窗口的情况下,TimerProc 是由 DispatchMessage 调用的。这是因为在 SetTimer 时指定了回调函数,DispatchMessage 会根据消息类型和定时器的设置来调用回调函数。

这种机制允许在没有窗口的情况下使用定时器,只要确保消息循环正常运行,TimerProc 就会被正确调用。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表