首页
学习
活动
专区
圈层
工具
发布

深入浅出MFC学习笔记1_GetMessage、PeekMessage、TranslateMessage、DispachMessage等等用法 消息循环中的TranslateMessage函数和Dis

备注:和函数GetMessage不一样的是,函数PeekMesssge在返回前不等待消息被放到队列里。...如果hWnd为C1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。...消息循环中的TranslateMessage函数和DispatchMessage函数 TranslateMessage函数 函数功能描述:将虚拟键消息转换为字符消息。...,让主 线程中等待用户输入,产生不同的消息,并把这些消息post给 子线程,子线程根据产生的消息做出不同的反映。...GetMessage函数只有在消息队列中有消息时返回,队列中无消息就会一直等,直至下一个消息出现时才返回。在等的这段时间,应用程序不能执行任何指令。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Windows窗口消息和消息队列

    消息队列 所有基于事件驱动的操作系统中的GUI程序,都会在主线程中运行一个消息泵来从消息队列中取出消息并执行对应的处理逻辑。...,由于没有窗口回调过程(WndCallback)会处理,因此需要在消息循环中处理发送给线程的消息。...这个函数不会使发送线程进入阻塞,也不会在本线程中加入应答消息. 5.应答一个消息 我们都知道在不同线程之间发送消息时,发送线程一旦检测到本线程的应答消息队列中有消息时就会返回,而函数: BOOL ReplyMessage...,若函数检测到QS_QUIT标志则返回FALSE, 否则返回TRUE,函数调用失败返回-1 typedef struct tagMSG { HWND hwnd; UINT...PeekMessage和GetMessage都会在内部处理完线程的所有发送消息队列中的消息 12.等待消息 BOOL WaitMessage(VOID); 当调用这个函数后线程将会挂起,直到线程的消息队列中有消息时线程才会恢复执行

    2.9K50

    【CC++】回调函数详解&注册窗口类&LRESULT & CALLBACK详解以及游戏中的应用

    投递一个消息的含义是将消息放到队列中,然后应用程序会在消息循环中调用 GetMessage 和 DispathMessage 函数获取分发消息。 Sending a message。...GetMessage 和 PeekMessage 前面讲到 GetMessage 会堵塞执行直到消息队列中有新的消息插入。...如果在游戏循环中调用 GetMessage 的时候正好消息队列为空就会导致下面的游戏逻辑不能及时执行。而游戏程序恰好对实时性要求极高,这就会造成游戏运行时期画面卡顿的现象。...为了解决这个问题,游戏程序中一般使用 PeekMessage 函数替代 GetMessage 函数,二者的功能几乎一致,唯一的差别是 PeekMessage 不管消息队列中有没有消息都会立刻返回,也就解决了刚刚提到的更新不及时和不更新卡顿假死问题...在你的主应用程序中,典型的响应 WM_DESTORY 消息的代码是调用 PostQuitMessage 函数。

    2.3K21

    Windows异步IO与消息循环的深度对话

    你用了MsgWaitForMultipleObjects吗?小王:用了啊,但还是有问题...第一幕:初识消息等待的陷阱老张:先看看你的代码结构?...MsgWaitForMultipleObjects返回"有消息",只意味着队列非空。如果队列有10条消息,你只处理1条就回去等待,系统立即又告诉你"有消息",你就陷入消息循环,永远不检查I/O了!...;如果ioEvent和消息同时就绪,可能返回WAIT_OBJECT_0(事件),也可能返回WAIT_OBJECT_0+2(消息),不确定!...情况九:句柄过滤的盲区老张:如果你只处理主窗口消息,那么:工具提示消息上下文菜单消息COM激活消息都可能被忽略。第四幕:构建健壮的解决方案小王:这么多坑!到底怎么写才安全?...{//处理消息processed++;}//处理后必须重新检查I/O事件原则二:定期检查事件老张:在消息循环中,要穿插检查I/O状态:展开代码语言:C++AI代码解释while(处理消息){//每处理几条消息就检查一次

    7910

    正確使用 SetCapture ReleaseCapture 「建议收藏」

    只要在DefWindowProc()響應WM_NCHITTEST消息時返回HTCLIENT,就可以達到這種效果,但是這樣主循環就不工作了,就好像是你在拖拽著它的標題欄一樣。...這樣做,程序的主循環可以一直在運作。這樣的窗口移動功能需要捕獲鼠標,那時因為如果你按下了鼠標左鍵,然後把鼠標從客戶區猛地拉到外面去,窗口仍然要能夠接收到WM_MOUSEMOVE消息。...編譯運行我給出的代碼,在拖拽主窗口客戶區的過程中,使用ALT+TAB按鍵將一個大些的窗口提到前面,這樣示例程序的主窗口就會全部被蓋住。...CreateMainWnd()) return -1; ShowWindow(g_hMainWnd, SW_SHOW); UpdateWindow(g_hMainWnd); MSG msg;...while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return

    69410

    WPF 的 Dispatcher 为什么要创建一个隐藏窗口?

    然而,试问这个问题: 一定需要此隐藏窗口吗? 消息循环不一定需要窗口来参与啊!没有窗口,消息循环依旧能持续进行并处理消息。...因此,如果收件人线程处于模式循环中, (MessageBox 或 DialogBox) ,则消息将丢失。 若要在模式循环中截获线程消息,请使用特定于线程的挂钩。...// 消息循环 while( (bRet = GetMessage( &msg, NULL, 0, 0 )) !...而开发者们为什么要自己去开消息循环呢?这不就是众所周知的“模态”吗???弹模态对话框的本质就是开了一个新的消息循环处理消息的同时,阻塞原来的消息循环。...由于内外层的消息循环都是调用的 GetMessage 函数取得消息,内层的消息循环退出后,对于外层消息循环来说消息已经被消费了,再也回不来了,这不就是丢失了吗?!

    90920

    深入理解 JavaScript 回调函数

    如果我们尝试在单线程事件循环中执行长时间运行的操作,则会阻止该过程。从技术上讲这是不好的,因为过程在等待操作完成时会停止处理其他事件。...获取并显示消息的函数 在上面的代码片段中,首先执行 getMessage()函数,然后执行 displayMessage() 。两者都在浏览器的控制台窗口中显示了一条消息,并且都立即执行。...该函数会暂停两秒钟,然后在控制台窗口中显示消息“ Hi,there”。 “显示的消息”将被显示在浏览器的控制台窗口中。在这种情况下,首先,我们需要等待 getMessage() 函数。...注意,当调用 getMessage() 函数时,我们仅将其引用传给 displayMessage() 函数。这就是为什么你不会在它旁边看到函数调用运算符,也就是() 符号。...Javascript 回调是异步的吗? JavaScript 被认为是单线程脚本语言。单线程是指 JavaScript 一次执行一个代码块。

    2.3K20

    第四章 Windows图形界面-上

    学习《Windows程序设计》记录 概念贴士: 1.  每个GUI应用程序至少应该创建一个窗口,称为主窗口,它作为用户与应用程序间的主界面来提供服务。...如果消息是WM_QUIT,则GetMessage函数返回FALSE,整个消息循环结束。消息具体的处理过程是在MainWndProc函数中进行的。...数据结构,表示消息放入消息队列时的鼠标位置 }MSG,*PMSG;   GetMessage函数从消息队列中取得的消息如果不是WM_QUIT,则返回非零值。...GetMessage函数如果从消息队列中取得的消息是WM_QUIT,它将返回0,从而促使WinMain函数离开消息循环,然后应用程序执行以下代码。...1 //当GetMessage返回0时程序结束 2 return msg.wParam;   此时,msg.wParam的值是传给PostQuitMessage函数的参数的值。

    26710

    异步,同步,阻塞,非阻塞程序的实现

    同步,异步 异步同步的差异,在于当线程调用函数的时候,线程获取消息的方式. 如果是同步,线程会等待接受函数的返回值(或者轮循函数结果,直到查出它的返回状态和返回值)。...此时,函数一般会立即返回状态,而不是等待求值。以免阻塞住线程。 他们没有关系 异步同步和阻塞非阻塞没有什么本质关联。一个讲的是消息方式,一个讲的是线程状态。...for task in tasks: try: next(task[1]) # 不断的轮循每个生成器关连的timer。...上面的代码中,在一个while循环中轮循timer的状态。由于timer存在于wait中。所以需要把timer“提取”出来。...1. 把timer 从生存器gen yield返回出来 2. 轮循timer的状态(实质是切换进出timer,看它有没有引发StopIteration异常) 3.

    10.2K10

    一站式WPF--线程模型和Dispatcher

    (主线程)进入GetMessage循环,取得消息后调用DispatchMessage分发消息。   ...这里的GetMessage循环就是所谓的消息泵,它像水泵一样源源不断的从线程的消息队列中取得消息,然后调用DispatchMessage把消息分发到各个窗口,交给窗口的WndProc去处理。   ...应用程序主线程处于GetMessage循环中,每次调用GetMessage获取一个消息,如果线程的消息队列为空,则线程会被挂起,直到线程消息队列存在消息线程会被重新激活。...Dispatcher的新意   在Winform的消息循环中, 为了线程安全,调用Control的Invoke或者BeginInvoke方法可以在创建控件的线程上执行委托,方法的返回值分别为object...程序启动时默认的主线程就是UI线程,它在调用Application.Run(也就是Dispatcher.Run)之后进入了一个GetMessage的循环中,对Window消息进行响应并构建执行一个个的DispatcherOperation

    75820

    一站式WPF--线程模型和Dispatcher

    (主线程)进入GetMessage循环,取得消息后调用DispatchMessage分发消息。   ...这里的GetMessage循环就是所谓的消息泵,它像水泵一样源源不断的从线程的消息队列中取得消息,然后调用DispatchMessage把消息分发到各个窗口,交给窗口的WndProc去处理。   ...应用程序主线程处于GetMessage循环中,每次调用GetMessage获取一个消息,如果线程的消息队列为空,则线程会被挂起,直到线程消息队列存在消息线程会被重新激活。...Dispatcher的新意   在Winform的消息循环中, 为了线程安全,调用Control的Invoke或者BeginInvoke方法可以在创建控件的线程上执行委托,方法的返回值分别为object...程序启动时默认的主线程就是UI线程,它在调用Application.Run(也就是Dispatcher.Run)之后进入了一个GetMessage的循环中,对Window消息进行响应并构建执行一个个的DispatcherOperation

    77611

    getcomponent_getsocketopt

    如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。...若想获得更多的错误信息,请调用GetLastError函数 补充: 应用程序通常用返回值来确定是否终止主消息循环并退出程序。...注意,此函数的返回值可非零、零或-1,应避免如下代码出现: while(GetMessage(IpMsg,hwnd,0,0))… -1返回值的可能性表示这样的代码会导致致命的应用程序错误。...如果hWnd为-1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。...在vs中输入float,然后按F1键,会在默认浏览器上打开帮助文档。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

    59610

    Linux操作系统之进程(七):进程的控制(下)

    对于非阻塞循环的返回值,当waitpid的返回大于0时,说明我们等待成功了,它返回的时等待成功的子进程pid,可以退出轮循调用waitpid的循环里了。...如果返回值为0,表示子进程还未返回,我们仍然需要接下来轮循调用waitpid。返回值为-1,表示等待出错误。...我们规定,正常完成工作返回为OK,宏值为0,fork进程失败返回1(FORK_ERROR),打开文件失败返回2(OPEN_FILE_ERROR)。有的同学说牢师牢师,为什么你后面两个宏没有初始化。...值得注意,exec系列的函数的返回值情况。如果替换数据与代码成功,自然是不需要返回值的,但如果替换失败了,就会返回-1!...所以我们一般都会在原环境变量中追加。

    15610

    Java代码评审歪诗!让你写出更加优秀的代码!

    贾言 代码评审歪诗 窗外风雪再大 也有我陪伴着你 全文字数:2000字 阅读时间:5分钟 贾言 代码评审歪诗 验幻空越重 命循频异长 依轮线日简 接偶正分壮 架构师说, 用20个字描述代码评审的内容..., 返回值验证注解约束提供方按注解要求返回参数。...循-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,考虑是否会打垮数据库...典型示例做法1: ? 典型示例做法2: ? 做法2的好处是将不同类型的逻辑解耦,各自发展,不会相互影响,如果添加类型也不必影响现有类型逻辑。...但是mq解耦的方式不能滥用,在同一系统内不宜过多使用mq消息来做异步,要尽可能保证接口的性能,而不是通过mq防止出问题后重新消费。

    6.9K20

    Kafka消费者的使用和原理

    我们继续看上面的代码,第3步,subscribe订阅期望消费的主题,然后进入第4步,轮循调用poll方法从Kafka服务器拉取消息。...而消息者在每次消费消息时都将会将偏移量进行提交,提交的偏移量为下次消费的位置,例如本次消费的偏移量为x,则提交的是x+1。 ?...若未来得及提交,也会造成重复消费,如果还想更进一步减少重复消费,可以在for循环中为commitAsync和commitSync传入分区和偏移量,进行更细粒度的提交,例如每1000条消息我们提交一次:...然后进入do-while循环,如果没有拉取到消息,将在不超时的情况下一直轮循。...如果没有消息则使用Fetcher准备拉取请求然后再通过ConsumerNetworkClient发送请求,最后返回消息。

    5.4K10
    领券