为什么多线程退出时提示异常类EOSError
为什么多线程退出时提示错误类EOSError
错误类EOSError,错误信息:'System Error Code:1400 无效的窗口句柄'
多线程更新主窗体的caption,点停止线程后,退出提示上面的错误
线程开始
procedure TForm1.Button1Click(Sender: TObject);
begin
myThread:=TMyThread.Create(true);
myThread.Resume;
end;
线程停止
procedure TForm1.Button2Click(Sender: TObject);
begin
myThread.Terminate;
end;
unit uMyThread;
interface
uses
Classes,Windows,SysUtils;
type
TMyThread = class(TThread)
private
protected
procedure Execute; override;
end;
implementation
uses Unit1;
procedure TMyThread.Execute;
var
i:Integer;
begin
Form1.PageControl1.ActivePageIndex:=1;
for i:=1 to 10000 do
begin
if Terminated then Break;
Sleep(50);
Form1.Caption:=inttostr(i);
end;
end;
end.
为什么呢?
------解决方案--------------------
Form1.PageControl1.ActivePageIndex:=1;
改成用同步方法
private
procedure xx();
...
procedure TMyThread.xx();
begin
Form1.PageControl1.ActivePageIndex:=1;
end;
procedure TMyThread.Execute;
var
i:Integer;
begin
synchronize(xx);
for i:=1 to 10000 do
...
------解决方案--------------------
改成发送消息吧 发给给窗口或线程 不用同步函数
如果需要传递内存地址 协商好由谁释放就可
------解决方案--------------------
将与UI有关的操作放在一个过程中,最后synchronize一次即可
错误类EOSError,错误信息:'System Error Code:1400 无效的窗口句柄'
多线程更新主窗体的caption,点停止线程后,退出提示上面的错误
线程开始
procedure TForm1.Button1Click(Sender: TObject);
begin
myThread:=TMyThread.Create(true);
myThread.Resume;
end;
线程停止
procedure TForm1.Button2Click(Sender: TObject);
begin
myThread.Terminate;
end;
unit uMyThread;
interface
uses
Classes,Windows,SysUtils;
type
TMyThread = class(TThread)
private
protected
procedure Execute; override;
end;
implementation
uses Unit1;
procedure TMyThread.Execute;
var
i:Integer;
begin
Form1.PageControl1.ActivePageIndex:=1;
for i:=1 to 10000 do
begin
if Terminated then Break;
Sleep(50);
Form1.Caption:=inttostr(i);
end;
end;
end.
为什么呢?
------解决方案--------------------
Form1.PageControl1.ActivePageIndex:=1;
改成用同步方法
private
procedure xx();
...
procedure TMyThread.xx();
begin
Form1.PageControl1.ActivePageIndex:=1;
end;
procedure TMyThread.Execute;
var
i:Integer;
begin
synchronize(xx);
for i:=1 to 10000 do
...
------解决方案--------------------
改成发送消息吧 发给给窗口或线程 不用同步函数
如果需要传递内存地址 协商好由谁释放就可
------解决方案--------------------
将与UI有关的操作放在一个过程中,最后synchronize一次即可