帖子没看明白。
1:DestoryWindow?该函数为WINAPI,是否为HOOK了该函数,还是应为响应WM_DESTROY消息的函数?
2:"线程中自己执行了ExitThread(),"?是SOCK辅线程吗?
3:MFC中好象不需主动CLOSEHANDLE,MFC帮你做了。
4:WaitForSingleObject(pMailThread->m_hThread, INFINITE)运行时进入过else括号中吗?

解决方案 »

  1.   

    回答:
    1、DestoryWindow是在MainFrm中对WM_DESTROY消息的响应。
    2、我在SOCKET线程(从CWinThread派生)的对WM_MSG_ACTION_STOP_THREAD消息的相应函数中
       执行了ExitThread()。
    3、CLOSEHANDLE是我自己看了一些东西瞎写的,病急了乱投医。
    4、在WaitForSingleObject返回之前,程序就已经出错了。我想知道一般正常的情况下,对于这种多线程,应该采用什么方式可以安全的退出?
    还有我这样做为何不能正常退出呢?
      

  2.   

    再线程里面设置BOOL bEndThread标志。if (bEndThread) then return;
      

  3.   

    BOOL bEndThread为全局变量。注意:要在线程的最里层循环放置退出判断。
      

  4.   

    反正没事可干,和你扯两句。
    1:不要主动调EXITTHREAD,MFC帮你做了。
    2:在UI线趁中关闭该线成是响应WM_QUIT消息,CWINTHREAD获得该消息会自动消掉线成。
        这么写POSTTHREADMESSAGE(WM_QUIT),但一定要确定该消息辅线成收到。
    3:在发消息WM_QUIT之前你发WM_MSG_ACTION_STOP_THREAD,在该消息响应函数里关闭你SOCK
    资源,
    4:用WaitForSingleObject(pMailThread->m_hThread, INFINITE)等待辅现成关闭,但注意主现成会挂起。
      

  5.   

    TO: Thunder_(少年游) 我现在遇到的问题时,在辅助线程中已经确实执行了退出线程的函数,但是没有主动的
    终止线程中的SOCK连接,没有回收sock资源。于是出现主线程被挂起,并且辅助线程一
    直等待到SOCK连接超时之后,才返回。当然等它返回的时候它所在的线程都已经被我关
    闭了。于是就出现异常错误。从你的回答中我想了想,正确的流程是不是应该是这样的:
    1、首先主线程截获关闭主窗口的消息
    2、主窗口发消息到SOCK辅助线程
    3、SOCK线程接到消息,首先终止处于运行或等待状态的SOCKET连接
    4、然后SOCK线程在收回SOCKET资源之后,在给自己发一个WM_QUIT消息,并改变某个信号量
    5、主线程WaitForSingleObject返回,并删除指向该线程的指针。
    6、主线程对下一个辅助线程操作...我想现在我仍然面对的问题就是:如何能实时的关闭正在运行的或者是出于等待状态下的
    SOCKET连接。并且能收回所有资源,不出现内存泄漏?可否继续指教?谢谢!
      

  6.   

    TO: Thunder_(少年游) 我现在遇到的问题时,在辅助线程中已经确实执行了退出线程的函数,但是没有主动的
    终止线程中的SOCK连接,没有回收sock资源。于是出现主线程被挂起,并且辅助线程一
    直等待到SOCK连接超时之后,才返回。当然等它返回的时候它所在的线程都已经被我关
    闭了。于是就出现异常错误。从你的回答中我想了想,正确的流程是不是应该是这样的:
    1、首先主线程截获关闭主窗口的消息
    2、主窗口发消息到SOCK辅助线程
    3、SOCK线程接到消息,首先终止处于运行或等待状态的SOCKET连接
    4、然后SOCK线程在收回SOCKET资源之后,在给自己发一个WM_QUIT消息,并改变某个信号量
    5、主线程WaitForSingleObject返回,并删除指向该线程的指针。
    6、主线程对下一个辅助线程操作...我想现在我仍然面对的问题就是:如何能实时的关闭正在运行的或者是处于等待状态下的
    SOCKET连接。并且能收回所有资源,不出现内存泄漏?可否继续指教?谢谢!
      

  7.   

    你的socket是阻塞的吗,如果是,那你的流程就行不通。因为socket在连接时,执行线程被阻塞,不可能收到消息,更不会自动终止处于运行或等待状态的SOCKET连接
      

  8.   

    俗话说强扭的瓜不甜,我们不能强制结束子线程,要post一个消息让线程自愿退出。如果是阻塞的通信,那没什么好说的,socket完事了子线程才能响应退出消息,之后再退出主线程。
    如果是非阻塞的,那需要先把socket的sendbuffer和recvbuffer清干净了再closesocket才退出子线程,再退出主线程。
      

  9.   


    就象FrankZhang123(FrankZhang123)说的,是否为堵塞模式?我估计你是堵塞模式。
    该模式下函数未返回,消息堵死,你收不到WM_MSG_ACTION_STOP_THREAD,你一定要想办法让TCP堵塞函数返回,否则你只有TERMINATE你的辅线程。
      

  10.   

    怎样判断一个socket是阻塞还是非阻塞模式呢?
    我的线程在等待的时候好像也能收到消息,我在WM_MSG_ACTION_STOP_THREAD消息的
    相应函数中的代码被执行了。
      

  11.   

    your question is OK ?
      

  12.   

    在线程的Exinstance中调用closesocket