一个简单的多线程,在两个edit里从1按顺序递增到50000,不能正确显示,都是先随机显示一个数字,停顿一会,然后跳到5000,不过有时也可以按顺序递增到50000,请问什么原因啊?
 源代码如下:
   procedure test.Disloop;
begin
  AEdit.text:=inttostr(CurrentLoop);
end;
constructor test.Create(Edit:TEdit;Max:integer);
begin
  inherited create(false);
  AEdit:=Edit;
  MaxLoop:=Max;
  FreeOnTerminate:=true;
end;
procedure test.Execute;
var
  i:integer;
begin
  for i:=0 to Maxloop do
  begin
    CurrentLoop:=i;
    Synchronize(Disloop);
    if Terminated then exit;
  end;
end;
end.

解决方案 »

  1.   


    unit utMutex;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        procedure SetItem(Sender: TObject);
      public
        { Public declarations }
      end;  TtestThread = class(TThread)
      protected
        procedure execute; override;
      end;
    var
      Form1: TForm1;
    implementation{$R *.dfm}
    const
      MAX = 128;
    var
       //cs : TRTLCriticalSection;
       DoFlag : integer = 0;
       hMutex : THandle = 0;
       NextNumber : integer = 0;
       iArr : array[1..MAX] of integer;function GetNextNumber: integer;
    begin
      result := NextNumber;
      inc(NextNumber);
    end;
    { TtestThread }procedure TtestThread.execute;
    var
      i : integer;
    begin
      inherited;
      FreeOnTerminate := True;
      OnTerminate := Form1.SetItem;
      //EnterCriticalSection(cs);
      if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
        for i := 1 to MAX do
        begin
          iArr[i] := GetNextNumber;
          sleep(5);
        end;
      //LeaveCriticalSection(cs);
      ReleaseMutex(hMutex);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //InitializeCriticalSection(cs);
      hMutex := CreateMutex(nil,false,nil);
      TtestThread.Create(false);
      TtestThread.Create(false);
    end;procedure TForm1.SetItem(Sender: TObject);
    var
      i : integer;
    begin
      inc(DoFlag);
      if DoFlag = 2 then
      begin
        for i := 1 to MAX do
          memo1.Lines.Add(inttostr(iArr[i]));
      //DeleteCriticalSection(cs);
        CloseHandle(hMutex);
      end;
    end;end.