War*_* P 7
你不应该事实上,调用任何方法或修改在所有的VCL控制的任何财产或任何可见的用户(应用程序的用户界面,这意味着VCL在Delphi中通常控制,无论是在一帧或不能)直接从后台线程.
但是,您可以使用PostMessage或TThread.Synchronize或向主线程发送事件或通知TThread.Queue.
最好不要将包含框架或其他控件的窗体的句柄传递给线程,并使用用户消息(WM_USER + 10001),而不是在线程对象中引用框架或控件. )像这样.
我更喜欢PostMessage到TTHread.Synchronize或Queue,因为它非常简单并且效果很好.它不是一个跨平台友好的技术,因为它与Win32 API相关联.
你应该像这样调用synchronize:
TMyThread = class(TThread)
private
FFrame: TFrame;
...
public
constructor Create(AFrame: TFrame);
...
end;
constructor TMyThread.Create(AFrame: TFrame);
begin
FFrame := AFrame;
inherited Create;
end;
// do not call directly, only using Synchronize
procedure TMyThread.AMethodWithNoParameters;
begin
FFrame.Button1.Enabled := not FBusy;
end;
procedure TMyThread.DoWork; // called from Execute.
begin
FBusy := true;
Synchronize(AMethodWithNoParameters);
Sleep(100); //dummy;
FBusy := false;
Synchronize(AMethodWithNoParameters);
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
998 次 |
| 最近记录: |