TerminateThread的第一个参数是什么?(100分)

  • 主题发起人 主题发起人 教父
  • 开始时间 开始时间

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi中可以用TerminateThread(AThread.Handle, 0);
但是在BCB中就不行,请问
在BCB中第一个参数应该是什么?
还有,用TerminateThread来终止一个TThread时,TThread好象并不知道自己被Terminate,
是不是这样?
 
TerminateThread是个api,在bcb中的如果已有声明 的话,就可以看到参数,也可以自己查找
一下。
 
BOOL TerminateThread(
HANDLE hThread, // handle to the thread
DWORD dwExitCode // exit code for the thread
);
 
maming:你狠,呵呵
 
不要用这个函数终止线程,最好让线程 自己返回,因为你用了上面的哪个函数
很多DLL没有清空被线程调用的函数的一些资源,这样容易导致内存泄露,一般
如果不能正常退出,可以是线程中的一些函数发生异常,使线程返回
 
还有一问啊?的确如此。
教父同学看看API啊?
Remarks
TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread isdo
ing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:
?If the target thread owns a critical section, the critical section will not be released.
?If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.
?If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.
A thread cannot protect itself against TerminateThread, other than by controlling access to its handles. The thread handle returned by the CreateThread and CreateProcess functions has THREAD_TERMINATE access, so any caller holding one of these handles can terminate your thread.
If the target thread is the last thread of a process when this function is called, the thread's process is also terminated.
The state of the thread object becomes signaled, releasing any other threads that had been waiting for the thread to terminate. The thread's termination status changes from STILL_ACTIVE to the value of the dwExitCode parameter.
 
首先要感谢上面几位的回答,不过我不是那种想都不想就提问题的人,所以那些东西我基本
上都已经查过了,我只是想知道在BCB中怎么实现TerminateThread(AThread.Handle, 0);
我也知道TerminateThread是不安全,但是请问有没有办法强行中止一个TThread?比如一个
TThread的Execute中的代码为:Sleep(n),在Sleep时,是没有办法检测Terminated标志的,
难道我就不能中止这个线程了吗?用Thread.Suspend;
再Thread.Free;
不稳定,而且在BCB
下效果更糟糕。
 
>我也知道TerminateThread是不安全,但是请问有没有办法强行中止一个TThread?
所谓强行退出一个THREAD,按你的情形,应该只有。TERMINATETHREAD
BCB手头没有,不好意思。
AThread->Handle不行?
那么CREATETHREAD返回的那个HANDLE行不行?
 
我用的是TThread
 
最好的办法是在线程的消息循环中设置一个标志,DELPHI的TTHREAD类就有一个
Terminated标志,在线程的循环中加一个NOT Terminate,你调用这个方法就可
以用使线程退出,一些其他的比如容易阻塞的函数,你可以使其他的一些参数
变成无效,使函数强行返回这样也可以使线程退出
 
<<BCB手头没有,不好意思。
<<AThread->Handle不行?
<<那么CREATETHREAD返回的那个HANDLE行不行?
这些HANDLE都不行,你在主线程中关闭这些HANDLE
只是说明你断绝和这些THREAD之间的关联,一般的
SDK标准写线程的办法就是一调用CREATETHREAD以后
如果不想得到线程什么时候结束完成的信息的话,就
马上用CLOSEHEAD把返回的线程句柄给关掉,减少资
源消耗.
 
to 张无忌:假如我的Execute中有一句Sleep(1000000);这样的语句,你怎么让它退出?
 
to 张:
》只是说明你断绝和这些THREAD之间的关联,
不会吧?那TERMINATETHREAD不就没有用了?
 
我的意思是TERMINATETHREAD可以关闭这个线程,CloseHandle就不能关闭这个线程,只能断开
和这个线程的关系
TO 教夫:
你让线程休息那么长时间,如果想退出只有TERMINATETHREAD了
 
晚了点,不好意思。
 
后退
顶部