waitforsingleobjectMFC下WaitForSingleObject用法

waitforsingleobject  时间:2021-06-07  阅读:()

c++里面的 WaitForSingleObject(singleMutex,INFINITE);问题

当另一个线程一直占着mutex的时候才会等待 #include <windows.h> #include <process.h> HANDLE mutex = NULL; unsigned int _stdcall threadfun( void* o ) { while( true ) { WaitForSingleObject(mutex,INFINITE); printf( "press key " ); getchar(); //当这里一直占着的时候,主线程就一直等,直到这里releasemutex ReleaseMutex( mutex ); } return 0; } int main( int argc, char** argv ) { mutex = CreateMutex(NULL,false,NULL); _beginthreadex( NULL, 0, threadfun, 0, 0, 0 ); while(true) { WaitForSingleObject(mutex, INFINITE); printf( "me " ); ReleaseMutex(mutex); } return 0; }

waitforsingleobject使用在什么地方

1. 创建CEvent实例 2. 在启动线程A时,将该实例传入线程A 3. 在线程A结束前,调用CEvent的SetEvent()成员 4. 在启动线程B的前面,等待CEvent的实例句柄 ::WaitForSingleObject(pEvent->m_hObject, INFINITE);

连续调用WaitForSingleObject怎么一直返回0

DWORD WaitForSingleObject(   HANDLE hHandle,   DWORD dwMilliseconds   ); 参数: hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。

如果事件是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。

  hHandle可以是下列对象的句柄:   Change notification   Console input   Event   Job   Memory resource notification   Mutex   Process   Semaphore   Thread   Waitable timer   WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回值才执行后面的代码。

此外,当dwMilliseconds设置为特殊值0时,测试hHandle核心对象是否被激发,函数立即返回。

返回值:   WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。

  WAIT_OBJECT_0 0x00000000 :核心对象已被激活   WAIT_TIMEOUT 0x00000102:等待超时   WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码   在这里举个例子:   先创建一个全局Event对象g_event:   CEvent g_event;   在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。

  下面是一个线程函数MyThreadPro()   UINT CFlushDlg::MyThreadProc( LPVOID pParam )   {   WaitForSingleObject(g_event,INFINITE);   For(;;)   {   ………….   }   return 0;   }   在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。

还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体   UINT CFlushDlg::MyThreadProc( LPVOID pParam )   {   while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)   {   ………………   }   return 0;   }   在这个线程函数中可以可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了。

DWORD WaitForMultipleObjects(DWORD dwCount, CONST HANDLE * phObjects, BOOL fWaitAll, DWORD dwMillseconds); dwCount 参数用于指明函数要查看的内核对象的数量。

这个值必须在1与MAXIMUM_WAIT_OBJECTS(windows头文件中定义为64之间)。

phObjects参数是指向内核对象句柄的数组的指针。

可以以两种不同的方式来使用WaitForMultipleObjects函数 1 让线程进入等待状态,直到指定内核对象中任何一个变为已通知状态 2 让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。

fWaitAll参数告诉该函数使用何种方式。

如果为该参数传递TRUE,那么在所有对象变为已通知状态之前,该函数不允许调用线程运行。

dwMillseconds参数的作用与它在WaitForSingObject中的作用完全相同。

如果等待规定的时间到了,那么该函数无论如何都会返回。

同样,通常为该参数传递INFINITE,但是在编写代码时候应该小心,以避免出现死锁情况。

WaitForMultipleObjects函数的返回值告诉调用线程,为什么它会被重新调度。

可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,这两个值的作用是很清楚的。

如果fWaitALL参数传递TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT_OBJECT_0。

如果fWaitAll传递FALSE,那么一旦任何一个对象变为已通知状态,该函数变返回。

这种情况下,如果想要知道哪个对象变为已通知状态。

返回值是WAIT_OBJECT_0与(WAIT_OBJECT_0+dwCount-1)之间的一个值。

也就是说,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么应该从返回值中减去WAIT_OBJECT_0。

产生的数字是作用第二个参数传递给WaitForMultipleObjects的句柄数组中的索引。

该索引说明哪个对象变为已通知状态。

示例: HANDLE h[3] h[0]=hProcess1; h[1]=hProcess2; h[3]=hProcess3; DWORD dw=WaitForMultipleObjects(3,h,FALSE,5000); switch(dw) { case WAIT_FAILED: //bad call to function(invalid handle?) break; case WAIT_TIMEOUT: //none of the objects became signaled within 5000 millisecond break; case WAIT_OBJECT_0 +1: //the process identified by h[1](hProcess2) terminated. break; case WAIT_OBJECT_0+2: //the process identified by h[2](hProcess3) terminated. break; } 如果为fWaitAll参数传递FALSE,WaitForMultipleObjects就从索引0开始向上对句柄数组进行扫描,同时已通知的第一个对象终止等待状态。

这可能产生一些你不希望有的结果。

例如,通过将3个进程句柄传递给该函数,你的线程就会等待3个子进程终止运行。

如果数组中索引为0的进程终止运行,WaitForMultipleObjects就会返回。

这时该线程就可以做它需要的任何事情,然后循环反复,等待另一个进程终止运行。

如果该线程传递相同的三个句柄,该函数立即再次返回WAIT_OBJECT_0,除非已经收到通知的句柄,否则代码就无法正确地运行。

总结:两者区别为,WaitForSingleObject 等待单一句柄对象, WaitForMultipleObjects 可等待多个句柄对象,由其第一个参数指定的句柄数组.

MFC下WaitForSingleObject用法

有必要把问题搞那么复杂吗? 用个while(1)循环不就解决了? int i=0; while(1) { if(m_webBrowser.GetReadyState() != READYSTATE_COMPLETE) { Sleep(1000);//等待1秒 i++; } else break; if(i>=10)//time out break; } 你非要用这个函数的话,下面的代码供你参考,具体怎样实现你的思路恐怕不是这一两句代码能实现的。

可能要涉及多线程。

HANDLE hMutex = CreateMutex(NULL,TRUE,NULL);//创建并拥有互斥对象 if(m_webBrowser.GetReadyState() == READYSTATE_COMPLETE) ReleaseMutex(hMutex);//加载完成后释放互斥对象 WaitingForSingleObject(hMutex,10000);//等待互斥对象

VPS云服务器GT线路,KVM虚vps消息CloudCone美国洛杉矶便宜年付VPS云服务器补货14美元/年

近日CloudCone发布了最新的补货消息,针对此前新年闪购年付便宜VPS云服务器计划方案进行了少量补货,KVM虚拟架构,美国洛杉矶CN2 GT线路,1Gbps带宽,最低3TB流量,仅需14美元/年,有需要国外便宜美国洛杉矶VPS云服务器的朋友可以尝试一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器...

RAKsmart含站群服务器/10G带宽不限流量首月半价

RAKsmart 商家估摸着前段时间服务器囤货较多,这两个月的促销活动好像有点针对独立服务器。前面才整理到七月份的服务器活动在有一些配置上比上个月折扣力度是大很多,而且今天看到再来部分的服务器首月半价,一般这样的促销有可能是商家库存充裕。比如近期有一些服务商挖矿服务器销售不好,也都会采用这些策略,就好比电脑硬件最近也有下降。不管如何,我们选择服务器或者VPS主机要本着符合自己需求,如果业务不需要,...

妮妮云(30元),美国300G防御 2核4G 107.6元,美国高速建站 2核2G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

waitforsingleobject为你推荐
企鹅医生共享体检真的方便吗jsmJSM们有用过什么化妆品能使鼻子和脸部立体泛珍珠白的感觉的产品吗?心水分享,谢谢eagleeye《鹰眼》的男主角是谁?扫图高清扫图是什么意思,在很多的贴吧里,都有提到一些高清扫图,是自己照杂志上的图片,然后自己再修一下吗微软操作系统下载微软原版xp系统下载网址是哪个啊?有没有免费就可以下载的?文本框透明word里文本框怎么透明?维基百科中文网站科普网页最大的谁有微信网页版怎么看朋友圈电脑版的微信怎么看朋友圈上传图片网站求一个可以上传图片外链的网站免费下载空间怎么下载免费的空间播放器
台湾vps 免费网站域名注册 Oray域名注册服务商 vps租用 technetcal Dedicated cdn服务器 国外服务器 好看的桌面背景大图 tk域名 免费个人网站申请 php空间申请 域名和空间 什么是服务器托管 t云 彩虹云 学生服务器 群英网络 空间申请 脚本大全 更多