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);//等待互斥对象
百纵科技怎么样?百纵科技国人商家,ISP ICP 电信增值许可证的正规公司,近期上线美国C3机房洛杉矶独立服务器,大带宽/高配置多ip站群服务器。百纵科技拥有专业技术售后团队,机器支持自动化,自助安装系统 重启,开机交付时间 30分钟内交付!美国洛杉矶高防服务器配置特点: 硬件配置高 线路稳定 洛杉矶C3机房等级T4 平价销售,支持免费测试,美国独服适合做站,满意付款。点击进入:百纵科技官方网站地...
onevps最新消息,为了更好服务中国区用户:1、网站支付方式新增了支付宝,即将增加微信;原信用卡、PayPal方式不变;(2)可以切换简体中文版网站,在网站顶部右上角找到那个米字旗,下拉可以换中国简体版本。VPS可选机房有:中国(香港)、新加坡、日本(东京)、美国(纽约、洛杉矶)、英国(伦敦)、荷兰(阿姆斯特丹)、瑞士(苏黎世)、德国(法兰克福)、澳大利亚(悉尼)。不管你的客户在亚太区域、美洲区...
天上云怎么样?天上云隶属于成都天上云网络科技有限公司,是一家提供云服务器及物理服务器的国人商家,目前商家针对香港物理机在做优惠促销,香港沙田机房采用三网直连,其中电信走CN2,带宽为50Mbps,不限制流量,商家提供IPMI,可以自行管理,随意安装系统,目前E3-1225/16G的套餐低至572元每月,有做大规模业务的朋友可以看看。点击进入:天上云官方网站天上云香港物理机服务器套餐:香港沙田数据中...
waitforsingleobject为你推荐
mac地址克隆mac地址克隆是什么意思。扫图问个非常白痴的问题撒,扫图是什么意思?seo优化技术什么是SEO优化,seo优化有什么用?jstz泰州哪里有民工市场遗传算法实例如何用C语言实现遗传算法的实际应用?assemblyinfoLOL的 X、L、CS 是什么意思谷歌图片识别如何打开PICASA头像识别功能?腾讯贴吧腾讯论坛里找自己发的帖微粒群算法粒子群算法优化下面的公式 要怎么做 能给个程序最好软件开发技术文档软件开发技术的目录
动态域名 便宜服务器 特价空间 合肥鹏博士 华为网络硬盘 165邮箱 建立邮箱 佛山高防服务器 网络空间租赁 稳定免费空间 vip购优惠 drupal安装 免费ftp lamp怎么读 apnic 密钥索引 聚惠网 winserver2008 海外加速 免费网站加速 更多