terminatethreadVB/易语言中TerminateThread如何终止线程?
terminatethread 时间:2021-07-16 阅读:(
)
TerminateThread杀不了线程怎么回事
这个我试过,跟中止进程类似,用API:
1.取线程中止码:GetExitCodeThread((void *)thread->Handle,&ExitCode);
2.强行中止: TerminateThread((void *)thread->Handle,ExitCode);
如此而已
这是一个死循环线程:
__fastcall MyThread::MyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
extern int js;
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
while (true)
js++; // 死循环,不停地计数
}
======================================================
//下面是主程序:
#include
#pragma
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int js=0; // 全局变量 js
MyThread *thread=NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Edit1->Text=js; // 时钟不断显示js值
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) // 运行线程
{
if (thread==NULL)
{
thread= new MyThread(true);
thread->Priority =tpHigher;
thread->Resume(); // 线程运行
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) // 中止线程
{
if (thread!=NULL)
{
unsigned long ExitCode;
if (!GetExitCodeThread((void *)thread->Handle,&ExitCode))
ShowMessage("得不到退出码,中止失败!");
else
{
if (TerminateThread((void *)thread->Handle,ExitCode))
{
delete thread;
thread=NULL;
}
else
ShowMessage("中止失败!");
}
}
}
中止线程后,Edit1的值就不再变化delphi 里如何创建线程执行完线程后结束线程.
在Delphi中使用线程,当窗体关闭时,如果窗体中启用了线程,一般需要手动关闭,以释放资源。
常用来结束线程的代码为:
PcmThrd.Terminate;
PcmThrd.WaitFor;
即先触发Terminate方法,然后等待线程的结束。
这种方法要求线程不能使用 FreeOnTerminate := True; ,否则在WaitFor即将结束的时候会引发“无效句柄”的错误。
这种方法在窗体关闭的时候会等待一段事件(因为WaitFor)。
因此,如果不是在主窗体中结束线程时,其实我们可以不必使用WaitFor。
而是采用如下方法:
将FreeOnTerminate := True;
这样在窗体关闭的代码中直接调用
PcmThrd.Terminate;
即可。
注意:
如果设置了
PcmThrd.OnTerminate := SomeFunction;
那么在调用PcmThrd.Terminate;前尽量将PcmThrd.OnTerminate := nil,以免结束线程后SomeFunction中的变量出现空指针错误。
当然,这不是绝对的,需要根据具体程序而定
DELPHI 线程的终止和退出
1、自然退出
一个线程从execute()过程中退出,即意味着线程的终止,此时将调用windows的exitthread()函数来清除线程所占用的堆栈。
如果线程对象的 freeonterminate 属性设为true,则线程对象将自动删除,并释放线程所占用的资源。
2、terminate属性退出
利用线程对象的terminate属性,可以由进程或者由其他线程控制线程的退出。
只需要简单的调用该线程的terminate方法,并设直线程对象的terminate属性为true。
在线程中,应该不断监视terminate的值,一旦发现为true,则退出,例如在execute()过程中可以这样写:
while not terminated do
begin
.......
end;
3、利用api 函数
线程退出的api 函数声明如下:
function terminatethread(hthread:thandle;dwexitcode:dword);
这个函数会使代码立刻终止,不管程序中有没有
try....finally
机制,可能会导致错误,不到万不得已,最好不要使用。
4、挂起后释放
利用挂起线程的suspend方法,后面跟个free,也可以释放线程,例如:
thread1.suspend; //挂起
thread1.free; //释放
遇到的" Code:1400 无效窗口句柄 "的问题,关闭不了程序
最近写程序,遇到的" Code:1400 无效窗口句柄 "的问题,关闭不了程序?!
似乎是在线程里调用了主窗体的东西,使得释放的先后次序被打乱了,所以句柄有问题!
但是要找到问题的根源太麻烦了,这时有招必杀技!
大家要记好了,有类似的无法关闭程序的问题,一句搞定!
ExitProcess(0);
简单的说就是终止自己的进程!虽然是暴力了一点,但是绝对有效!
但是这种方法不会触发onclose之类的事件,可以说是不触发任何事件,无痛无痒地结束了进程,干净利落,所以要记得在结束之前保存必要的数据,做必要的操作,最好是释放一下内存,在Win下结束进程是非常不干净的,会有内存残留。
获取线程状态
Function CheckThreadFreed(aThread: TThread): Byte;
var
i: DWord;
IsQuit: Boolean;
begin
if Assigned(aThread) then
begin
IsQuit := GetExitCodeThread(aThread.Handle, i);
if IsQuit then //If the function eeds, the return value is nonzero.
//If the function fails, the return value is zero.
begin
if i = STILL_ACTIVE then //If the specified thread has not terminated,
//the termination status returned is STILL_ACTIVE.
Result := 1
else
Result := 2; //aThread未Free,因为Tthread.Destroy中有执行语句
end
else
Result := 0; //可以用GetLastError取得错误代码
end
else
Result := 3;
end;
快速关闭线程
//=========ThrdMain.pas==================
Var
hEventDead:Thandle;
constructor ThrdMain.Create;
begin
hEventDead := CreateEvent(0,true,False,‘‘);//创建对象事件
inherited Create(False);
end;
//创建对象关闭事件
function ThrdMain.WaitEventDead: Boolean;
begin
//创建线程
var
Thread_Main:ThrdMain ;(调用自我创建的线程对象)
Thread_Main:=ThrdMain.Create ;
//关闭线程
Thread_Main.WaitEventDead ;
Thread_Main.WaitFor ;
//=========ThrdMain.pas==================
var
hEventDead:Thandle;
constructor ThrdMain.Create;
begin
hEventDead := CreateEvent(0,true,False,‘‘);//创建对象事件
inherited Create(False);
end;
//创建对象关闭事件
function ThrdMain.WaitEventDead: Boolean;
begin
Gbl_ReadSMS:=False;
WaitForSingleObject(hEventDead,500);//表示在0.5秒内强制关闭
end;
多线程的检查,与关闭线程
procedure TDemoThread.Execute;
begin
inherited;
if Assigned(FOnHintText) then
FOnHintText(Self);
end;
procedure TForm1.ShowThreadDemo(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 1000 do
begin
Memo1.Lines.Add(IntToStr(i));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
vI: DWord;
IsQuit: Boolean;
begin
Demo := TDemoThread.Create(True); //True:创建时不启动线程
Demo.FreeOnTerminate := True; //设置程结束时自动释放
Demo.FOnHintText := ShowThreadDemo;
//Demo.OnTerminate:= ShowThreadDemo;
Demo.Resume; //启劫线程
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
vI: DWord;
IsQuit: Boolean;
begin
if Demo <> nil then
begin
vi := CheckThreadFreed(Demo); //检查当前线程是否在执行
if (vi = 1) or (vi = 2) then
TerminateThread(Demo.Handle, vi); //如果线程在执行则强行退出
Demo.Free;
end;
{if Demo<> nil then
begin
Demo.Terminate ;
Demo.WaitFor ;
end;} //等待线程结束,并终止它
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Demo.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
vI: DWord;
IsQuit: Boolean;
begin
//判断当前线程的状态
vI := CheckThreadFreed(Demo);
ShowMessage(IntToStr(vI));
end;Terminate是请求结束一个线程,那么如何真正结束一个线程呢?
推荐通过让线程运行结束返回的方法结束线程. 仅当你确切知道该线程的作用和该线程在结束时可能运行的代码的时候调用TerminateThread 来结束线程. 不然后果是它的初始化堆栈没有被释放, 占用的临界区没有释放,连接到该线程的 DLLs 没有知道该线程要结束, 而且如果目标线程管理着一个共享 DLL 的全局状态, 则该 DLL 的状态可能被毁坏, 影响到其他的 DLL 用户.VB/易语言中TerminateThread如何终止线程?
VB6.0的。
代码如下。
单击窗体效果就显现。
================Option ExplicitPrivate Declare Function GetCurrentThread Lib "kernel32" () As LongPrivate Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As LongPrivate Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As LongPrivate Sub Form_Click()Dim hT As OLE_HANDLE, lEC As LonghT = GetCurrentThreadGetExitCodeThread hT, lECTerminateThread hT, lECEnd Sub
官方网站:点击访问青云互联活动官网优惠码:终身88折扣优惠码:WN789-2021香港测试IP:154.196.254美国测试IP:243.164.1活动方案:用户购买任意全区域云服务器月付以上享受免费更换IP服务;限美国区域云服务器凡是购买均可以提交工单定制天机防火墙高防御保护端口以及保护模式;香港区域购买季度、半年付、年付周期均可免费申请额外1IP;使用优惠码购买后续费周期终身同活动价,价格不...
轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。活动规则:用户购买任意全区域云服务器月付以上享受免费更换IP服...
艾云怎么样?艾云是一家去年年底成立的国人主机商家,商家主要销售基于KVM虚拟架构的VPS服务,机房目前有美国洛杉矶、圣何塞和英国伦敦,目前商家推出了一些年付特价套餐,性价比非常高,洛杉矶套餐低至85元每年,给500M带宽,可解奈飞,另外圣何塞也有特价机器;1核/1G/20G SSD/3T/2.5Gbps,有需要的朋友以入手。点击进入:艾云官方网站艾云vps促销套餐:KVM虚拟架构,自带20G的防御...
terminatethread为你推荐
g2g吉他的效果器的名称是什么意思?(G1G,G2G等等)策略组电脑组策略详解查字网騳骉,怎样读?拼音网关和路由器的区别路由器和网关有什么区别?arc是什么意思数学中的arctan是什么意思索引超出了数组界限求助大神什么叫索引超出了数组界限radius认证电信或网通的RADIUS认证都记录些什么?谁能说说ISP的宽带帐号检查流程cf加速器玩CF需要用加速器吗?qq业务中心QQ业务怎么开通?图片存储手机照片的保存方法?
虚拟主机申请 虚拟空间哪个好 ip查域名 in域名注册 长沙域名注册公司 已备案域名注册 重庆域名注册 网站域名备案查询 荷兰vps virpus asp.net主机 ix主机 tier 512av 新世界电讯 2017年万圣节 主机合租 权嘉云 帽子云 免费个人空间 更多