对于WaitForSingleObject和WaitForMultipleObjects函数,如果里面的参数是event的法,则他们等的是这个事件的发生;这个俺理解。可是我看有些程序里面,WaitForSingleObject和WaitForMultipleObjects里面的参数是线程Thread的句柄Handle;请问这种情况下WaitForSingleObject和WaitForMultipleObjects到底等的是什么??
解决方案 »
- 窗口移动机制问题:
- 如何使编辑框内显示的数值不被覆盖,而是跟在前面数值的后面显示
- 有关ICONINFO结构成员功能的问题
- 求<<Visual C+++SQL Server数据库开发与实例>>随书源码
- 如何利用线程创建计时器(C++,或是C语言)
- 键盘钩子的应用 ?
- 正利用RAS API做ADSL拨号程序(SDK),无法得到状态信息、请教。高分必送.
- 请问IO_COUNTERS这个结构怎么用的?
- 急急急——如何让我CText的对象和一个CEdit对象对应起来,以便使CText对象获得焦点
- 回答“请问用VC编的程序怎样才能离开VC环境,独立运行?”的朋友们,特别是SXBYL、CHINAJIANG,请到WWW.SXMB.GOV.CN的聊天室一叙!也欢迎对VC访问数据库熟悉的朋友
- 树控件和右键点击弹出菜单的问题!
- 如何把unicode的字符串变为char *
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
for thread
=================================================
when active non-signaled
when terminated signaledfor Event
=================================================
when SetEvent() signaled
when ResetEvent() non-signaled
是 说等待所有的线程执行结束毕后,WaitForMultipleObjects就返回吗?
还是说 所有的线程都开始执行, WaitForMultipleObjects就返回?
如果AfxBeginThread参数设置是0,即创建后立即执行呢?算激发还是未激发啊????
我在窗口上放置一个按钮,按钮的点击事件是: 首先对所有的工作者线程PostQueuedCompletionStatus一个特殊的标志【在PostQueuedCompletionStatus的overlapped参数里面设置】,当工作者线程里面这么写的
while(TRUE){
GetQueuedCompletionStatus(........)
}如果GetQueuedCompletionStatus得到的overlapped是这个特殊标志的时候,工作者线程就return 0,这样按理说工作者线程就应当退出返回了; 这个按钮的点击事件接着就是执行WaitForMultipleObjects,可是问题在于这个时候程序就一直在WaitForMultipleObjects上呆住了,感觉程序就象死掉了;我查看日志,工作者线程没有接收到PostQueuedCompletionStatus出来的特殊标志【因为我在程序里面增加了如果工作者线程接收到这个特殊标志,就在日志里面提示,可是结果是在日志里面没有这个提示啊】;
我想不应当是PostQueuedCompletionStatus或者工作者线程没有接收到这个标志,因为我试着在另外一个按钮的点击事件里面只执行PostQueuedCompletionStatus的,所有的工作者线程确实接收到这个标志【日志里面确实有提示】,并且返回了。 不知道这是为什么啊?让这个问题郁闷了好几天了,还是没有解决啊。
注意看啊,我 threadfunc里sleep了1秒,
(ThreadFunc没设置sleep 1秒的话,KK和main我也不知道是那儿先弹的)
而我WaitForMultipleObjects了10秒
这是 为什么了?
不说要 线程执行完毕了还激活吗?
怎么就弹出了main了了?void CEeDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HANDLE _pThread[5]; int i;
for (i= 0; i< 5; i++)
{
_pThread[i] = AfxBeginThread(ThreadFunc,
NULL,
THREAD_PRIORITY_NORMAL,
0,
0,
NULL);
}
//Sleep(1000); WaitForMultipleObjects(5,_pThread,true,10000);
AfxMessageBox("main");}UINT CEeDlg::ThreadFunc(LPVOID ThreadArg)
{
Sleep(1000);
AfxMessageBox("kk");
return 1;
}
NULL,
THREAD_PRIORITY_NORMAL,
0,
0,
NULL);AfxBeginThread 返回的是CWinThread* 不是HANDLE用CreateThread
HANDLE _pThread[5]; int i;
for (i= 0; i< 5; i++)
{
DWORD dwThreadID = 0;
_pThread[i] = ::CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadID);
}
DWORD dwRet = WaitForMultipleObjects(5,_pThread,true,10000);
DWORD dwError = ::GetLastError();
AfxMessageBox("main");
}
DWORD WINAPI CWaitForMultipleObjectsDlg::ThreadFunc(LPVOID ThreadArg)
{
Sleep(1000);
AfxMessageBox("kk");
return 1;
}
使用了这个以后
即便几个子线程ThreadFunc 5到6秒就搞定的事情
也被硬生生的等了10秒
我现在想知道
怎样判断上面所建立的5个线程已经全部执行完毕
(我的1个小程序要处理的东西用子线程做
然后想判断下到底完成了没,可不知道怎么判断)