在主程序中做一段循环,在这之前建一个子线程对一个数进行累加,
现发现在主程序循环的时候子线程不进行累加
如何处理在主程序循环的时候子线程也进行累加

解决方案 »

  1.   

    应该是可以同时执行的。
    建议在主线程中循环时sleep一下看子线程能否执行。
    也许子线程已经结束或根本没起来。
      

  2.   

    先谢谢大家了,我把源码贴上来
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      TSplash = class(TThread)
    protected
         procedure SetProgress;
         procedure Execute; override;
      end;
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
    aSplash :TSplash;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TSplash }procedure TSplash.Execute;
    var
    iBegin:Integer;
    begin
      inherited;
    FreeOnTerminate:=true;
        while true do
        begin
         iBegin := GetTicKCount;
         while GetTickCount-iBegin <500 do
            begin
             ;
            end;
        Synchronize(SetProgress);
        end;
    end;procedure TSplash.SetProgress;
    begin
        Form1.ProgressBar1.StepBy(8);
        if Form1.ProgressBar1.Position > 95 then
            Form1.ProgressBar1.Position := 20;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    iBegin :Integer;
    begin
    iBegin := GetTicKCount;
    while (GetTickCount-iBegin<4000) do
        begin
         ;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    aSplash := TSplash.Create(false);
    end;end.
    ------------------------------
    程序运行后按Button2,这时ProgressBar1是会响应一直动的,但按了
    Button1后,ProgressBar1就不动了,直到Button1完成后ProgressBar1才
    继续响应;现希望不改动Button1的代码,在Button1里的代码运行时
    ProgressBar1也在响应
      

  3.   

    在线程里,一般用 sleep(XXX)就可,不用 while GetTickCount-iBegin <500 do
     那么麻烦;然后,
    procedure TForm1.Button1Click(Sender: TObject);
    var
    iBegin :Integer;
    begin
    iBegin := GetTicKCount;
    while (GetTickCount-iBegin<4000) do
        begin
         ;
        end;
    end;你省略的不知道是什么,最后叫上 Application.ProcessMessage;
      

  4.   

    ;就是做空循环呀,我就是不想加上Application.ProcessMessage的,因为Button1其实是调用另外的东西的,又不可能修改调用的东西
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iBegin :Integer;
    begin
    iBegin := GetTicKCount;
             aSplash.WaitFor;
    end;
      

  6.   

    Button1里的代码是不能修改的,本来是调用一个远程的过程,相当于在做空循环,我这里是模拟调用的,因此要求Button1里代码不修改而能实现
      

  7.   

    仔细分析了一下,造成这种结果是必然的,因为在主线程里的空循环会使主线程锁定去执行那个循环,此时主线程不能响应任何操作,而子线程却会一直等待更新主线程中的progressbar,所以一直等待到主线程可以访问,因为这个结果所以如果你在主线程的那个循环里加上application.ProcessMessages;就可以改边这种状况,但是你说你又不象用application.ProcessMessages;  所以要解决你的问题,你只有把那个循环再新开辟一个线程(就是你访问远程过程的线程)。
      

  8.   

    去掉Synchronize
    Synchronize就是同步,把程序交给主线程执行
      

  9.   

    因为Synchronize了, 主线程把子线程锁了,子线程不能访问主线程的VCL资源
    要是不用Application.ProcessMessage的话,用Sleep也可以,就是利用中断了