没有完的讨论:主  题:终止线程问题,救命呀 !!!!!!!!!!!!!!!!!!!!!!!!!!
作  者:MagicLD
所属论坛:Visual C++
问题点数:23
回复次数:9
发表时间:2001-9-4 16:50:23
 
  
  我在一个线程中调用了一个耗时很长的存储过程(数据库是MS SQLServer,访问方式为ODBC API),我如何在存储过程返回之前终止这个线程呢?????????????? 
回复贴子: 
回复人: yj5460ppp(鱼香肉丝) (2001-9-4 16:53:44)  得0分 
TerminateThread()  
回复人: MagicLD(Magic) (2001-9-4 16:59:12)  得0分 
yj5460ppp(鱼香肉丝),我用的是AfxBeginThread启动的线程,怎么能获得TerminateThread()参数中的Handle呢?  
回复人: jyf7862(jyf) (2001-9-4 17:00:32)  得0分 
你最好在该线程里面调用AfxEndThread()来终止线程,
你可以计算如果存储过程超时,就调用改函数终止线程。在外部就调用TerminateThread()
终止线程,不过改函数可能不会释放线程占用的资源  
回复人: MagicLD(Magic) (2001-9-4 17:04:03)  得0分 
jyf7862(jyf),调用存储过程时是同步的,在没有返回前,这个线程怎么才能获得其他线程传送的结束消息呢?  
回复人: jyf7862(jyf) (2001-9-4 17:17:28)  得0分 
回答如何取得Handle:
AfxBeginThread返回改线程的指针
用该指针可以获得CWinThread的m_hThread属性,就是这个Handle拉  
回复人: jyf7862(jyf) (2001-9-4 17:19:43)  得0分 
你用那种形式的AfxBeginThread产生线程的?  
回复人: RealaKang(阿康) (2001-9-4 17:41:00)  得0分 
你用AfxBeginThread启动线程的话,CWinThread* pThread;
pThread= AfxBeginThread( pfnThreadProc,  pParam);
可以用pThread来控制线程的挂起,结束等。
结束线程  pThread->TerminateThread();   
 
回复人: RealaKang(阿康) (2001-9-4 22:13:33)  得0分 
不好意思,犯了一个错误,用pThread无法调用TerminateThread.你还是在进程内调用AfxEndThread(),有参数,或者干脆return 0;就行了.至于线程结束的时机,如果想在线程外控制结束,那就又要用线程通信了,用PostMassage,或定义CEvent都行.
 
回复人: jfzsl(剿匪总司令) (2001-9-6 18:08:37)  得0分 
《技术内幕中》(P215)中说“但线程对象没有成员函数可以用来终止线程”!从MSDN中可以找到void AfxEndThread( UINT nExitCode )。可是这个nExitCode为何物?从MSDN中有看到
BOOL GetExitCodeThread(
  HANDLE hThread,      // handle to the thread
  LPDWORD lpExitCode  // termination status
);
是不是这样就可以了?顺便问问,  线程结束(return)后是否就终止了?返回到什么地方去了?他的返回值谁来接收呢? 

解决方案 »

  1.   

    你启动的是一个worker线程,这个线程只要你的线程函数返回就会自动结束,而线程函数的返回值就是线程的推出值,不用你调用什么函数去结束它。
    对于一个UI线程来说,最简单的方法就是调用win32的::PostQuitMessage()。如果使用AfxEndThread()函数结束线程,注意要释放资源,而且需要手动删除线程对象