按照一般的delphi书上的介绍:多线程是不能访问主线程的vcl控件的。如果一定要访问,则必须使用synchronize函数。
  于是我写了一个测试程序,很短,功能:用一个线程在主程序界面上的edit1.text里面显示1-1000000的数字。分别用了synchronize函数和没用用。  问题:为什么没有用synchronize函数程序运行正常,用了synchronize函数反而出现问题???////////////////////////// 程序1//////////////////////////////
没有使用synchronize函数,但测试结果,程序运行正常。
/////////////////////////////////////////////////////////////
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;type
   tmythread = class(Tthread)
  private
  protected
    procedure execute; override  ;
    procedure giveanswer;
  end;var
  Form1: TForm1;
var
  exc:boolean;
  i:integer;implementation{$R *.dfm}procedure tmythread.execute;
begin
  freeonterminate:=true;
  for i:=1 to 10000000 do
    begin
      if exc=false then break;
        form1.Edit1.Text :=inttostr(i);
    end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  exc:=true;
  tmythread.Create(false);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  exc:=false;
end;end.
////////////////////////// 程序2//////////////////////////////
使用synchronize函数。测试结果,可以正常运行,但如果在运行过程中
移动了程序的窗体,或者改变窗体的大小,程序会无响应。
/////////////////////////////////////////////////////////////
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;type
   tmythread = class(Tthread)
  private
  protected
    procedure execute; override  ;
    procedure giveanswer;
  end;var
  Form1: TForm1;
var
  exc:boolean;
  i:integer;implementation{$R *.dfm}procedure Tmythread.giveanswer ;
begin
  form1.Edit1.Text :=inttostr(i);
end;
procedure tmythread.execute;
begin
  freeonterminate:=true;  for i:=1 to 10000000 do
    begin
      if exc=false then break;
         synchronize(giveanswer);
    end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
exc:=true;
tmythread.Create(false);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  exc:=false;
end;end.

解决方案 »

  1.   

    1.书上说的没错!  你的程序1尽管能运行,并且效率高,是多线程序并发执行,但是有隐患,在主线程也同时访问EDIT时就会出现问题.2.你的程序2理论上是可以的,但是,你一下子给主线程序发了10000000个消息去处理,等他处理完后才会响应你!
      

  2.   

    synchronize(giveanswer);就是告诉主线程,让主线程执行giveanswer部分. 所以此类问题的解决方法是:  将高数据级的循环放在附属线程中, 将每步循环的处理结果保存在临时变量中,等循环结束,再synchronize; 这样主线程的工作量小,可以同时响就主线程的消息!
      

  3.   

    for i:=1 to 10000000 do
        begin
          if exc=false then break;
             synchronize(giveanswer);
            sleep(10); //正常要加這句
        end; IFindit(寻找其中的乐趣) ( ) 信誉:100 
    基本表達了正确的意思了
      

  4.   

    sleep(10);   同意楼上!
      

  5.   

    多线程是不能访问主线程的vcl控件的,这句话不对呀。
    可以访问,但VCL不是线程安全的,即如果你在线程中操作VCL。
    同时你在主线程中也要操作该VCL,那些就会出现危险了。是这个意思
      

  6.   

    说出现危险太恐怖,感觉有生命危险似的:)http://dev.csdn.net/develop/article/22/22466.shtm
    http://dev.csdn.net/develop/article/22/22467.shtm
    http://dev.csdn.net/develop/article/22/22468.shtm
    http://dev.csdn.net/develop/article/22/22469.shtm
    http://dev.csdn.net/develop/article/22/22470.shtm
      

  7.   

    BTW:你看的书肯定不是偶写的:P