菜鸟-c 和 windows API 消息循环的问题

hq1 2024-11-29 阅读:2 评论:0
网上科普有关“菜鸟:c 和 windows API 消息循环的问题”话题很是火热,小编也是针对菜鸟:c 和 windows API 消息循环的问题寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。如何你...

网上科普有关“菜鸟:c 和 windows API 消息循环的问题”话题很是火热,小编也是针对菜鸟:c 和 windows API 消息循环的问题寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

如何你在窗口函数case不返回的话这个窗口就会没响应的,你可以试试看在一个case里写Sleep(5000)

有些人已经说对了,GetMessage只负责从消息队列里面取出一条消息,TranslateMessage将键盘敲键的消息转换成WM_CHAR消息,DispatchMessage就负责调用你的窗口函数,其实相当于

... DispatchMessage(...)

{

....

WinSunProc(...): //事实上这里是通过你注册窗口类时候给Windows的函数指针来实现的,但是效果和直接调用一样。

}

现在整个流程就很清楚了,GetMessage -> DispatchMessage -> WinSunProc 然后再返回到主循环进行下一条消息的操作,如果你在WinSunProc里面一直不返回,那么程序是无法处理下条消息的。

处理消息的时候如果又有其他消息过来是没关系的,Windows的GetMessage是从消息“队列”里面去消息的,没来得处理的消息是会排队在消息队列里面的,微软说了Windows的消息队列足够长,一般不会出现消息丢失的情况,具体没说多长,可能根据操作系统版本不同有不同的长度限制。

另外GetMessage还有个特性,如果程序的消息队列是空的,也就是没有消息了,那么GetMessage就不会返回,直到等到下一条消息来再返回,Windows会将处于等待的程序转入Idle模式,所以那个while循环是不会出现CPU100%的占用率的。如果你希望在程序没有消息的时候在后台做点什么事情,那么就可以利用PeekMessage,典型的MFC就是利用了PeekMessage来运作消息循环的,PeekMessage在队列中有消息的时候则把消息取回,没消息的时候也会立刻返回,这样你就可以在没消息的时候做点别的事情。MFC的CWinApp类在Run这个函数中包含了消息循环,在没有消息的时候,Run会去调用CWinApp::OnIdle,默认的OnIdle会负责释放不需要再使用的动态连接库文件。如果Run里面的PeekMessage取到消息,他则调用CWinApp::PumpMessage函数,PumpMessage就负责调用DispatchMessage把消息转交给窗口函数。

贴下CWinApp::Run的代码:

int CWinThread::Run()

{

ASSERT_VALID(this);

_AFX_THREAD_STATE* pState = AfxGetThreadState();

// for tracking the idle time state

BOOL bIdle = TRUE;

LONG lIdleCount = 0;

// acquire and dispatch messages until a WM_QUIT message is received.

for (;;)

{

// phase1: check to see if we can do idle work

while (bIdle &&

!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))

{

// call OnIdle while in bIdle state

if (!OnIdle(lIdleCount++))

bIdle = FALSE; // assume "no idle" state

}

// phase2: pump messages while available

do

{

// pump message, but quit on WM_QUIT

if (!PumpMessage())

return ExitInstance();

// reset "no idle" state after pumping "normal" message

//if (IsIdleMessage(&m_msgCur))

if (IsIdleMessage(&(pState->m_msgCur)))

{

bIdle = TRUE;

lIdleCount = 0;

}

} while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));

}

}

菜鸟关于Windows消息循环的疑问

ORA-00600: ?, ?: [6006], [1], [], [], [], [], [], [], [], [], [], []

报600错误, 且是SMON报错

你可以尝试

startup mount;

alter system set event='10513 trace name context forever,level 2';

shutdown immediate;

startup;

可以绕过部分问题

如果自己搞不定可以找ASKMACLEAN专业数据库修复团队成员帮您恢复:

快递的快递单号在哪里

如何你在窗口函数case不返回的话这个窗口就会没响应的,你可以试试看在一个case里写Sleep(5000)

有些人已经说对了,GetMessage只负责从消息队列里面取出一条消息,TranslateMessage将键盘敲键的消息转换成WM_CHAR消息,DispatchMessage就负责调用你的窗口函数,其实相当于

... DispatchMessage(...)

{

....

WinSunProc(...): //事实上这里是通过你注册窗口类时候给Windows的函数指针来实现的,但是效果和直接调用一样。

}

现在整个流程就很清楚了,GetMessage -> DispatchMessage -> WinSunProc 然后再返回到主循环进行下一条消息的操作,如果你在WinSunProc里面一直不返回,那么程序是无法处理下条消息的。

处理消息的时候如果又有其他消息过来是没关系的,Windows的GetMessage是从消息“队列”里面去消息的,没来得处理的消息是会排队在消息队列里面的,微软说了Windows的消息队列足够长,一般不会出现消息丢失的情况,具体没说多长,可能根据操作系统版本不同有不同的长度限制。

另外GetMessage还有个特性,如果程序的消息队列是空的,也就是没有消息了,那么GetMessage就不会返回,直到等到下一条消息来再返回,Windows会将处于等待的程序转入Idle模式,所以那个while循环是不会出现CPU100%的占用率的。如果你希望在程序没有消息的时候在后台做点什么事情,那么就可以利用PeekMessage,典型的MFC就是利用了PeekMessage来运作消息循环的,PeekMessage在队列中有消息的时候则把消息取回,没消息的时候也会立刻返回,这样你就可以在没消息的时候做点别的事情。MFC的CWinApp类在Run这个函数中包含了消息循环,在没有消息的时候,Run会去调用CWinApp::OnIdle,默认的OnIdle会负责释放不需要再使用的动态连接库文件。如果Run里面的PeekMessage取到消息,他则调用CWinApp::PumpMessage函数,PumpMessage就负责调用DispatchMessage把消息转交给窗口函数。

贴下CWinApp::Run的代码:

int CWinThread::Run()

{

ASSERT_VALID(this);

_AFX_THREAD_STATE* pState = AfxGetThreadState();

// for tracking the idle time state

BOOL bIdle = TRUE;

LONG lIdleCount = 0;

// acquire and dispatch messages until a WM_QUIT message is received.

for (;;)

{

// phase1: check to see if we can do idle work

while (bIdle &&

!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))

{

// call OnIdle while in bIdle state

if (!OnIdle(lIdleCount++))

bIdle = FALSE; // assume "no idle" state

}

// phase2: pump messages while available

do

{

// pump message, but quit on WM_QUIT

if (!PumpMessage())

return ExitInstance();

// reset "no idle" state after pumping "normal" message

//if (IsIdleMessage(&m_msgCur))

if (IsIdleMessage(&(pState->m_msgCur)))

{

bIdle = TRUE;

lIdleCount = 0;

}

} while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));

}

}

快递单号一般在快递单的最上部,和最下部。因快递公司的不同,快递单号在快递单最上具体位置也不统一:

中通快递单号位于快递单的右上角和下部:

圆通快递单号位于快递单的右上角和下部:

天天快递单号位于快递单的上方居中和下部:

韵达快递单号位于快递单的上方居中和下部:

申通快递单号位于快递单的上方居右和下部:

EMS快递单号位于快递单的上方居中和下部:

顺丰快递单号位于快递单的上方居中

关于“菜鸟:c 和 windows API 消息循环的问题”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

热门文章
  • 湖南邵阳退休金调整细则 湖南养老金调整方案出炉

    湖南邵阳退休金调整细则 湖南养老金调整方案出炉
    湖南邵阳退休金调整细则2022年邵阳市退休人员工资调整细则:1退休人员每月增加基本养老金35元,2,在1项调整基础上退休人员按缴费年限,每年每人每月增加1.2元,缴费年限不满一年的记为一年,同时以2021年12月为基本养老金为基数,再加1.4。3,在1项,2项调整后基础上,到2021年12月30止,年满70岁不满80岁的退休人员每月再增加15元。对年满80岁以上的,每人每月增加25元。湖南企退人员养老金调整方案是根据湖南省政府的相关政策制定的。根据最新的调整方案,湖南企退人员...
  • 特斯拉国产Model3基础车价降至3238万元,补贴后不足30万元 model3降价至19.9万

    特斯拉国产Model3基础车价降至3238万元,补贴后不足30万元 model3降价至19.9万
    特斯拉国产Model3基础车价降至3238万元,补贴后不足30万元1月3日,特斯拉官方宣布,国产Model 3基础车价从35.58万元下调至32.38万元(包含基础版辅助驾驶功能),降价3.2万元。同时,根据国家政策,全系Model 3可以享受免征购置税政策,以及24750元的新能源补贴金额,国产Model 3补贴后售价为29.905万元。解读:这次降价,基本上可以视为中国市场的消费者,对国产特斯拉原先定价的不满意,这将会造成需求的不乐观。这个定价,已经开始杀进了宝马3系、奔...
  • 深圳2025年中考好考吗 2025为什么被称为高考最难念

    深圳2025年中考好考吗 2025为什么被称为高考最难念
    深圳2025年中考好考吗深圳2025年中考相对来说是好考的。1.因为深圳教育资源相对丰富,有许多优秀的中学和培训机构,提供了良好的学习环境和帮助,有利于学生备考。2.深圳的中考题目相对来说较为传统,与其他地区相比并没有特别的难度,学生通过系统的学习和备考是可以应对的。3.此外,深圳的教育部门也注重教育公平,为中考提供了合理的评价体系和政策,保障了学生的公平竞争机会。所以,综合考虑,深圳2025年中考对于认真备考的学生来说是可以顺利应对的。2025年高考要考多少分才能上985和...
  • 梅西什么时候转会迈阿密 梅西现身迈阿密超市

    梅西什么时候转会迈阿密 梅西现身迈阿密超市
    梅西什么时候转会迈阿密7月16日,球王梅西正式加盟美国职业大联盟弱旅迈阿密国际,36岁的他与新东家签约至2025年底,同时梅西还有续约一年的选项。 在签约仪式上,梅西表示:“在迈阿密国际和美职联开启我职业生涯的新征程,我感到非常兴奋。 这是一次极好的机会,我们将为实现俱乐部的宏伟计划一起努力。 ”过去两个赛季,梅西在巴黎圣日耳曼身披30号球衣,他婉谢了好兄弟内马尔把大巴黎10号球衣让给他的好意。到了迈阿密国际,梅西穿回自己熟悉的10号战袍,这是他在阿根廷国家队和巴塞罗那穿了多...
  • 桌上有12支蜡烛吹灭了5支还剩几支 点燃10支蜡烛吹灭4支还剩几支

    桌上有12支蜡烛吹灭了5支还剩几支 点燃10支蜡烛吹灭4支还剩几支
    桌上有12支蜡烛吹灭了5支还剩几支十二只。 所剩下的7支蜡烛全部烧尽的情况下还有5支;所剩下的7支蜡烛还没有烧完的情况下还有12支。 这得看过多久再算蜡烛,其它蜡烛没烧完时算,12支都在,等其它蜡烛烧完了算,就剩5支被吹灭的。4.晚上停电,小文在家点了8支蜡烛,先被风吹灭了1支蜡烛,后来又被风吹灭了2支.最后还剩多少支蜡烛同意楼上说的,要看过多久去数,马上去数当然是8支蜡烛了。 过一两个小时的话,没被吹灭的5支烧完了,当然只剩下3至蜡烛了。桌上有7支蜡烛,吹灭了5支,还有几支...