您的位置:程序门 -> vc/mfc -> 进程/线程/dll



createevent函数和waitforsingleobject问题,急


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


createevent函数和waitforsingleobject问题,急
发表于:2007-05-25 10:42:48 楼主
handle   evtprint;
void   cmain_dlg::onstart()  
{
//   todo:   add   your   control   notification   handler   code   here
evtprint   =   createevent(null,   false,   true,   null);
  pthread=afxbeginthread(mainthread,this);//启动线程thread_priority_highest
    closehandle(evtprint);
}
uint   cmain_dlg::mainthread(lpvoid   pparam)
{

        cmain_dlg   *   pp   =   (cmain_dlg   *)   pparam;//获取指向cmain_dlg对象的指针
while   (true)  
{
if(waitforsingleobject(evtprint,   infinite)==wait_object_0)
{
afxmessagebox( "sdfsdf ");
}
else   return   0;
}
return   0;
}
发表于:2007-05-25 10:43:301楼 得分:0
对话框出不来呀   ,怎么回事
发表于:2007-05-25 10:48:502楼 得分:0
有可能是你的现成还没创建好时,主现成已经运行   closehandle(evtprint)了.在pthread=afxbeginthread(mainthread,this);后加一个sleep(1000);试试
发表于:2007-05-25 10:52:393楼 得分:0
evtprint   =   createevent(null,   true,   false,   null);
发表于:2007-05-25 11:02:164楼 得分:0
esprite2000(稀饭):
问题是应该象你说的那样,不过在closehandle后
waitforsingleobject(evtprint,   infinite)应该返回的是什么呢
发表于:2007-05-25 11:05:405楼 得分:0
这个好像是无法预料的^_^
发表于:2007-05-25 11:10:136楼 得分:0
那我在   closehandle(evtprint);前面加这样的语句:
waitforsingleobject(pthread-> m_hthread,infinite);//等待线程结束
界面就死了,应该在什么时候去掉
evtprint资源呢?在线程里??
发表于:2007-05-25 11:13:457楼 得分:0
一般在程序结束的时候closehandle,如果你使用对话框的话在它的ondestroy里调用也可以
发表于:2007-05-25 11:18:118楼 得分:0
哦   3q   怎么给分啊~~`
发表于:2007-05-25 11:18:469楼 得分:0
那我在   closehandle(evtprint);前面加这样的语句:
waitforsingleobject(pthread-> m_hthread,infinite);//等待线程结束
界面为什么就死了
发表于:2007-05-25 11:21:4810楼 得分:0
pthread=afxbeginthread(mainthread,this);//启动线程thread_priority_highest
    closehandle(evtprint);
========================================
closehandle(evtprint)//你都将它关掉了,它还有什么用.在结束时调用它.
发表于:2007-05-25 11:38:2911楼 得分:0
那我在   closehandle(evtprint);前面加这样的语句:
waitforsingleobject(pthread-> m_hthread,infinite);//等待线程结束
界面为什么就死了
-------------------------------
waitforsingleobject()会一直阻塞在那   除非event状态有变化
发表于:2007-05-25 13:50:3512楼 得分:0
waitforsingleobject()   is   blocking   the   current   thread   until   the   event   object   becomes   signaled.

in   ur   code,

since   evtprint   is   initialized   as   signaled,   waitforsingleobject(hevt)   returns   wait_object_0   immediately.


waitforsingleobject(evtprint,   infinite)应该返回的是什么呢

if   this   handle   (here   is   hevt)   is   closed   while   the   wait   is   still   pending,   the   function 's   behavior   is   undefined.


那我在   closehandle(evtprint);前面加这样的语句:
waitforsingleobject(pthread-> m_hthread,infinite);//等待线程结束
界面就死了

不应该死吧?

在这行下断,看看pthread-> m_hthread是不是valid   handle?

发表于:2007-05-28 00:52:3313楼 得分:0
主线程返回太早了,线程创建完毕就closehandle了,造成你线程里等待函数不是返回wait_object_0,而是返回kernel   ojbect废弃的返回码,建议作如下修改:

void   cmain_dlg::onstart()  
{
//   todo:   add   your   control   notification   handler   code   here
  evtprint   =   createevent(null,   false,   true,   null);
  pthread=afxbeginthread(mainthread,this);//启动线程thread_priority_highest

  /*wait   for   subthread   to   exit*/
  waitforsingleobject(pthread,   infinite);
  closehandle(evtprint);
  /*set   evtprint   to   nil*/
  evtprint   =   null;
}

//以上代码请测试


快速检索

最新资讯
热门点击