例如在分线程里创建按钮,下面的无法正确创建去掉或者保留CoUninitialize()都会错unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,unit2;type
TForm1 = class(TForm)
pnl: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;var
Form1: TForm1;
implementation
{$R *.dfm}
var th:TMyThread;procedure TForm1.Button1Click(Sender: TObject);
begin
th:=TMyThread.Create(false);
th.FreeOnTerminate:=false;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,ComObj,ActiveX, StdVcl;type
TMyThread = class(TThread)
private
bt:TButton;
protected
procedure Execute; override;
end;implementation
uses unit1;procedure TMyThread.Execute;
begin
OleCheck(CoInitializeEx(0,0));
bt:=TButton.Create(form1.pnl);
bt.Parent:=form1.pnl;
bt.Visible:=true;
CoUninitialize();
end;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,unit2;type
TForm1 = class(TForm)
pnl: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;var
Form1: TForm1;
implementation
{$R *.dfm}
var th:TMyThread;procedure TForm1.Button1Click(Sender: TObject);
begin
th:=TMyThread.Create(false);
th.FreeOnTerminate:=false;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,ComObj,ActiveX, StdVcl;type
TMyThread = class(TThread)
private
bt:TButton;
protected
procedure Execute; override;
end;implementation
uses unit1;procedure TMyThread.Execute;
begin
OleCheck(CoInitializeEx(0,0));
bt:=TButton.Create(form1.pnl);
bt.Parent:=form1.pnl;
bt.Visible:=true;
CoUninitialize();
end;
end.
bt.Parent:=form1.pnl;
bt.Visible:=true;这几句放到一个函数里,再在线程里用同步函数调用
DELPHI里的控件多线程是不安全的,必须由主线程处理