SetEvent的问题

whutxuan 2004-10-29 11:46:06
HANDLE g_hEvent
HANDLE g_refreshthread
DWORD WINAPI refreshsearch()
{
DWORD dwWaitRet = 0;

Sleep(5000) //确保可以Wait到event
dwWaitRet = WaitForSingleObject(g_hEvent,100);
if(dwWaitRet == WAIT_OBJECT_0)
{
ResetEvent(g_hEvent); //
return 0;
}

}


void main()
{
DWORD ret = 0;
char tmp[10];

g_hEvent = CreateEvent(0,TRUE,FALSE,"killrefresh");
g_refreshthread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)refreshsearch,(LPVOID)NULL,
0,&ThreadID); //*/

SetEvent(g_hEvent);
Sleep(15000);

ret = WaitForSingleObject(g_hEvent,500);

}



如果 子线程
if(dwWaitRet == WAIT_OBJECT_0)
{

SetEvent(g_hEvent); //RestEvent改为SetEvent
return 0;
}

这样
那么主线程执行到以下的时候:
ret = WaitForSingleObject(g_hEvent,500);
返回0。


问题是主线程已经SetEvent了,子线程在WaitForSingleObject的成功,并没有把g_Event进行Reset,怎么可以对它再次SetEvent呢
...全文
440 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
whutxuan 2004-11-01
  • 打赏
  • 举报
回复
up
whutxuan 2004-10-31
  • 打赏
  • 举报
回复
Event的机制和Mutex不一样。
Mutex是在WaitWaitForSingleObject成功之后,其他进程会阻塞等待,
可是主线程SetEvent之后,又怎么知道子线程接收到了Event信号了没有?
接受到了信号之后,有是怎么处理的呢?

创建两个Event,父子进程分别设置对方的。
threadA_Event是线程
A发给线程B的信号,
threadB_Event是线程
B发给线程A的信号,

SetEvent(threadA_event)后,
线程B收到消息后,
SetEvent(theadB_event)后,
父线程就可以受到消息了。

如果用一个Event,也可以A setevent后,
B接收到后Retsetevent,
A
WaitForSingleObject会返回一个错误,
通过这个错误就知道B已经接收到信号了。

哪个办法好呢?

xxedge 2004-10-30
  • 打赏
  • 举报
回复
创建两个Event,父子进程分别设置对方的。
oyljerry 2004-10-30
  • 打赏
  • 举报
回复
主线程中最好不要用WaitForSingleObject,否则会阻塞整个进程的
whutxuan 2004-10-30
  • 打赏
  • 举报
回复
up
allenq 2004-10-30
  • 打赏
  • 举报
回复
g_hEvent = CreateEvent(0,TRUE,FALSE,"killrefresh");你用的是手动的Event, 你在主线程中当然可以Reset了。
CreateEvent的第一个参数设置为FALSE, 你可以看看。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧