vc程序
定义
CWinThread* socketthread;
socketthread = NULL;程序满足某种条件时
socketthread = AfxBeginThread(ClientThread, (LPVOID)fileinfo);
但是,有时候因为一些特殊原因,需要立即强行结束线程,
DWORD dwExitCode;
if (socketthread!=NULL)
{
GetExitCodeThread( socketthread->m_hThread, &dwExitCode );//dwExitCode 返回259

AfxEndThread( dwExitCode, TRUE );//程序崩溃
}
哪位知道代码问题在哪里?怎样修改?谢谢?

解决方案 »

  1.   

    Warning  If a thread happens to return STILL_ACTIVE (259) as an error code, applications that test for this value could end up in an infinite loop.
      

  2.   

    如果一个线程将 STILL_ACTIVE 作为错误码返回,则检测该线程的应用程序将陷入死循环。
      

  3.   

    我的线程实际上是通过socket传输文件,用户选择文件后开始传输,但如在传输过程中用户重新选择了文件(例如用户开始选择文件A,传输过程中用户又改选文件B),这时需要停止线程,改为传输文件B。
      

  4.   

    你要先关闭socket,然后退出发送循环,然后线程自己退出
      

  5.   

    AfxEndThread 是使用在你的线程函数(ClientThread)中的代码,而不是在你的主叫线程中,所以你的用法是错误的
    要从外部线程强行终止另一线程,使用TerminateThread
      

  6.   

    我的socket线程会打开一个固定名字的文件(例如a.tmp),现在的问题是主程序停止socket线程时,如果用TerminateThread强行停止线程,可能a.tmp正处在打开状态,没能关闭文件,造成下次重新启动线程后无法打开文件;而如果主程序用postthreadmessage(WM_QUIT,0,0)关闭线程,又可能因正在操作文件而停止不下来。
    我现在也在考虑从主程序传一个变量,socket根据这个变量判断自己是否应关闭,需关闭时用AfxEndThread(0)来关闭 ,但这又带来一个新的问题,就是我什么时候去判断这个变量?因为我的socket线程作的事情很多,这样做是不是需要我隔几行代码就要执行一下判断?
    各位有没有好的办法?谢谢!
    初学vc,问题比较幼稚,望各位高手帮忙,再次感谢!
      

  7.   

    是的,不可以让线程连续执行时间太长,只能隔几行代码就要执行一下判断,这可能是唯一安全的办法
    TerminateThread会带来线程栈空间无法正常回收,消耗进程地址空间和系统内存,多次执行的结果必然会程序崩溃
      

  8.   

    不要试图从外部强行结束线程,如13L所说,当强行结束一个线程时栈无法回收,默认情况下是1M。LZ可以试着去写个循环试试看。