小弟最近实现了一个 组件
该组件里跑着一个线程,以及存在一个命令队列而这个线程用来等待执行命令队列中的各种动作
我是这样设计的CString CmdList[10];//保存了各种命令
HANDLE CmdListEvent[10];//对应于命令列表,用CreateEvent来创建这个10个事件对象然后我在线程中
用WaitForMultipleObjects来等待CmdListEvent这10个事件对象,只等一个就返回
如果等到了这个事件对象以后,再获取这个事件对象的下标,然后读取对应的CmdList
并执行相应的操作,且事件对象是自动复位的在外部调用这个组件的时候 只要设置CMDLIST后在激活对应下标的CmdListEvent的事件对象
就可以让线程工作了这个实现思路我觉得没有问题,工作也正常,但是我发现有时候程序退出的时候会卡死不知道是为什么
我是这样让线程安全退出的
===========退出部分代码============
PublicModule.AXStatus =false;//设置这个全局变量为FALSE后 线程会每次判断,如果为FLASE线程退出
DWORD WaitResult;if (PublicModule.FTPCmdThreadHandle!=NULL)
{
do
{
::SetEvent(PublicModule.CmdListEvent[0]);//设置为有信号让线程退出,
                //(这里随便找了一个事件对象,激活他以便线程能继续工作)
WaitResult=::WaitForSingleObject(PublicModule.FTPCmdThreadHandle,100);
}while(WaitResult!=WAIT_OBJECT_0&&WaitResult!=WAIT_FAILED);
::CloseHandle(PublicModule.FTPCmdThreadHandle);
}
==========线程中退出部分代码================
while(PublicModule.AXStatus==true)//只有在打开时工作
{
WaitResult=::WaitForMultipleObjects(MAXCMDLIST,PublicModule.CmdListEvent,FALSE,INFINITE);
if (PublicModule.AXStatus==false) break;//说明是退出
        //走到这里不是强制退出 说明有命令需要处理
        //DO ....} 
============================
请问我这样实现思路上有什么问题吗
我现在发现程序退出时候经常无响应 好象是因为线程没法结束而不段的在等待

解决方案 »

  1.   

    如果 WaitResult 每次都是 WAIT_TIMEOUT 你这个循环就卡在这里了。
      

  2.   

    好像看起来没有什么问题
    平时对于单一事件的时候都是这样做,多事件还没有试过,不过应该是一样的另外你打印一下相关的日志看看
    两个等待事件的前后,将相关的参数信息打印出来看看
    while(PublicModule.AXStatus==true)//只有在打开时工作 

    WaitResult=::WaitForMultipleObjects(MAXCMDLIST,PublicModule.CmdListEvent,FALSE,INFINITE); // 这里给一个时间看,不要无限期等// 如果是timeout的话,判断一下是否要退出,如果不用退出就continueif (PublicModule.AXStatus==false) break;//说明是退出 
            //走到这里不是强制退出 说明有命令需要处理 
            //DO .... } 
      

  3.   


    如果你是以让工作线程退出为目的而加的这个检测,那就完全可以把它去掉了。如果你的工作线程只是为了执行命令,不涉及到影响数据的状态(比如某个命令不处理,则必须在退出前把它保存起来,以便在下次程序运行时执行,这就算影响了。)
    那你完全可以直接退出。反正进程一结束,关于它的一切都over了,工作线程自然就被OS强制结束了。如果要影响,那就需要检测一下为什么WaitForSingleObject(PublicModule.FTPCmdThreadHandle,100); 被另外的线程一直hold了。
      

  4.   

    好了  我解决了  是因为我自己的问题
    线程代码没有问题 问题出在我在线程中SENDMESSAGE到一个其他窗体的消息 但是那个
    窗体已经销毁了 导致这个线程卡死了 
    抱歉  谢谢各位 给分了