例如在分线程里创建按钮,下面的无法正确创建去掉或者保留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.

解决方案 »

  1.   

    bt:=TButton.Create(form1.pnl); 
    bt.Parent:=form1.pnl; 
    bt.Visible:=true;这几句放到一个函数里,再在线程里用同步函数调用
    DELPHI里的控件多线程是不安全的,必须由主线程处理
      

  2.   

    to idecl:有时候就是要考虑到速度问题,我才开了分线程分担一部分工作。但是同步的话,主线程那边的工作会暂停掉,直到分线程完成了,主线程那边的工作才会继续下去,看起来很卡,速度不行。还有没有更好的方法? :-)