访问线程中的vcl组件!德尔福

Pea*_*lyk 2 delphi multithreading

所以,我的目标是在另一个线程中启动一个函数.此外,我需要从新线程访问其他vcl组件.到目前为止,这是我的代码:

procedure TForm1.StartButtonClick(Sender: TObject);
var
thread1: integer;
id1: longword;
begin
   thread1 := beginthread(nil,0,Addr(Tform1.fetchingdata),nil,0,id1);
    closehandle(thread1);
end;

procedure TForm1.FetchingData;
var
  ...
begin
  Idhttp1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;   //<- error
  idhttp1.Request.ContentType := 'application/x-www-form-urlencoded';
Run Code Online (Sandbox Code Playgroud)

我的程序挂起,我收到错误:00154E53模块my.exe中的异常EAccessViolation.模块"my.exe"中地址00554E53的访问冲突.读取地址00000398.

提前致谢.

mgh*_*hie 9

AV的原因是您将TForm方法的地址传递给期望的函数TThreadFunc(请参阅文档System.BeginThread()).使用Addr()这样是一种让编译器指出你的错误的好方法.

你需要做的是编写一个具有正确签名的包装函数,将表单实例作为参数传递,并从该函数调用表单上的方法.

但是不要去那里,要么将代码编写为后代TThread,要么(最好)使用更高级别的包装器,如AsyncCallsOmni Thread Library.并确保您不访问主线程中的VCL组件,创建并释放工作线程中所需的组件.


Too*_*the 5

VCL(Gui组件)只能从主线程访问.其他线程需要主线程才能访问VCL.