以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- WaitForSingleObject 函数解析 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=61024) |
-- 作者:卷积内核 -- 发布时间:4/8/2008 9:49:00 AM -- WaitForSingleObject 函数解析 WaitForSingleObject的用法 DWORD WaitForSingleObject( hHandle可以是下列对象的句柄: Change notification WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。在这里举个例子: 先创建一个全局Event对象g_event: CEvent g_event; 在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态。 下面是一个线程函数MyThreadPro() UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程。 还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体 UINT CFlushDlg::MyThreadProc( LPVOID pParam ) |
-- 作者:卷积内核 -- 发布时间:4/8/2008 9:49:00 AM -- 本质上还是有时间概念的,只是被MS给藏起来了。说到底就是个do while(true)循环.满足条件了就goto跳出。 WaitForSingleObject是kernel32.dll的导出函数,dasm下看到WaitForSingleObject又调用了ntdll.dll的NtWaitForSingleObject. NtWaitForSingleObject又调用了KeWaitForSingleObject 以下是KeWaitForSingleObject的部分实现代码。(以上部分为原创,代码部分为转贴。) do { WaitStatus = CurrentThread->WaitStatus; CurrentThread->WaitBlockList = WaitBlock = &CurrentThread->WaitBlock[0]; CurrentObject = (PDISPATCHER_HEADER)Object; if (KiIsObjectSignaled(CurrentObject, CurrentThread)) } WaitBlock->Object = CurrentObject; KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status); CurrentThread->WaitStatus = Status; if (Timeout != NULL) InsertTailList(&CurrentObject->WaitListHead, &WaitBlock->WaitListEntry); if (CurrentThread->Queue) PsBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason); if (Status != STATUS_KERNEL_APC) DPRINT("Looping Again\n"); } while (TRUE); WaitDone: 综合这些考虑。是有时间概念的。而这个do while究竟占用多少CPU资源就不好算了,但是肯定是一个有时间概念的东西。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
37.109ms |