没有完的讨论:主 题:终止线程问题,救命呀 !!!!!!!!!!!!!!!!!!!!!!!!!!
作 者: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)后是否就终止了?返回到什么地方去了?他的返回值谁来接收呢?
作 者: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)后是否就终止了?返回到什么地方去了?他的返回值谁来接收呢?
对于一个UI线程来说,最简单的方法就是调用win32的::PostQuitMessage()。如果使用AfxEndThread()函数结束线程,注意要释放资源,而且需要手动删除线程对象