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.
提前致谢.
AV的原因是您将TForm
方法的地址传递给期望的函数TThreadFunc
(请参阅文档System.BeginThread()
).使用Addr()
这样是一种让编译器指出你的错误的好方法.
你需要做的是编写一个具有正确签名的包装函数,将表单实例作为参数传递,并从该函数调用表单上的方法.
但是不要去那里,要么将代码编写为后代TThread
,要么(最好)使用更高级别的包装器,如AsyncCalls或Omni Thread Library.并确保您不访问主线程中的VCL组件,创建并释放工作线程中所需的组件.
归档时间: |
|
查看次数: |
3015 次 |
最近记录: |