gpt4 book ai didi

multithreading - 简单的多线程Delphi

转载 作者:行者123 更新时间:2023-12-03 18:26:39 28 4
gpt4 key购买 nike

我对线程还是很陌生。我想创建一个过程,以在主线程创建必要的表单时测试有效的Internet连接。该代码段在构造函数的结尾处停止,并出现“无法在运行中的线程或挂起的线程上调用Start”错误。由于某种原因,此错误后主窗体已关闭

constructor TPingThread.Create(IDThread: Integer);
begin
Self.FID:=IDThread;
Self.FreeOnTerminate:=true;
end;

destructor TPingThread.Destroy;
begin
EndThread(FID);
inherited;
end;

procedure TPingThread.Execute;
var
iTimeOuts, K: Byte;
sWebpage: String;
begin
inherited;
iTimeOuts:=0;
FIdPing:=TIdHTTP.Create(nil);
for k:=1 to 3 do
begin
Try
FIdPing.ConnectTimeout:=2000;
sWebpage:=FIdPing.Get('http://www.google.co.za')
Except
On Exception do inc(iTimeOuts);
End;
end;
if iTimeOuts=3 then MessageDlg('A working internetconnection is needed to reset your password',mtWarning,[mbOK],0);
if iTimeOuts=0 then FInternetConnection:=false
else FInternetConnection:=true;
FreeAndNil(FIdPing);
end;

最佳答案

您的代码存在一些问题:

  • 您需要调用inherited构造函数:
    constructor TPingThread.Create(IDThread: Integer);
    begin
    inherited Create(false); // Or true to create a suspended thread
    Self.FID:=IDThread;
    ...
  • 删除inherited方法中的Execute调用,因为这是TThread的抽象声明。本身不是错误,但为清晰起见应避免。
  • 在Execute方法中创建FIdPing后,请使用try/final。
  • 正如@mjn所说,无需调用EndThread(),因为TThread会为您处理此问题。
  • 从线程调用VCL MessageDlg()并不是线程安全的。您需要同步调用或使用Application.MessageBox(Windows MessageBox的Delphi包装器)。最好的解决方案是跳过对话框,然后将错误消息传递给主线程,这仍然需要知道此错误。
  • 关于multithreading - 简单的多线程Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29539493/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com