以下代码
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;type  TMainThread = class(TThread)
  private
    FCount: LongInt;
    procedure WriteFcout;
  public
    procedure Execute; override;
    constructor Create(IsSuspend: Boolean);
  end;
  TCenterThread = class(TThread)
  private
    FCount: LongInt;
    procedure WriteFcout;
  public
    procedure Execute; override;
    constructor Create(IsSuspend: Boolean);
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    FP: TStringList;
  public
    { Public declarations }  end;var
  Form1: TForm1;
  ThreadLock: LongInt;
  MainThread: TMainThread;
  CenterThread: TCenterThread;
implementation{$R *.dfm}constructor TMainThread.Create(IsSuspend: Boolean);
begin
  inherited Create(IsSuspend);
  FreeOnTerminate := True;
  FCount := 0;
end;procedure TMainThread.Execute;
var i: Integer;
begin
  i := 0;
  while i < 10 do
  begin
    Inc(FCount);
    Synchronize(WriteFcout);    
    InterlockedIncrement(ThreadLock);
    if CenterThread.Suspended then
      CenterThread.Resume;
    Inc(i);
  end;
end;procedure TMainThread.WriteFcout;
begin
  Form1.Memo1.Lines.Add('A');
end;constructor TCenterThread.Create(IsSuspend: Boolean);
begin
  inherited Create(IsSuspend);
  FreeOnTerminate := True;
  FCount := 0;
end;procedure TCenterThread.Execute;
var i: LongInt;
begin
  while not Terminated do
  begin
    if ThreadLock > 0 then
    begin
      InterlockedDecrement(ThreadLock);
      Inc(FCount);
      Synchronize(WriteFcout);    
   end
    else
      Suspend;
  end;
end;procedure TCenterThread.WriteFcout;
begin
  Form1.Memo1.Lines.Add('B');
end;procedure TForm1.Button1Click(Sender: TObject);
var i: LongInt;
begin
  if MainThread.Suspended then
    MainThread.Resume;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  MainThread.Terminate;
  CenterThread.Terminate;
end;procedure TForm1.FormShow(Sender: TObject);
begin
  MainThread := TMainThread.Create(True);
  CenterThread := TCenterThread.Create(True);
  ThreadLock := 0;
end;end.
按 Button1后得 Memo1中得到结果如下。
A
B
A
A
A
A
A
A
A
A
A
请问是什么原因
理想结果应该是10个A,10个B 交替出现,但是在只有10个A、1个B 请问是什么原因

解决方案 »

  1.   

    你把ThreadLock的值打印出来就知道是怎么回事了。
      

  2.   

    procedure TCenterThread.Execute;
    var i: LongInt;
    begin
    while not Terminated do
    begin
      if ThreadLock > 0 then
      begin
        Sleep(1);
        Inc(FCount);
        Synchronize(WriteFcout);
        InterlockedDecrement(ThreadLock);    if MainThread.Suspended then
          MainThread.Resume;
        Suspend;
      end
    end;
    end;
    procedure TMainThread.Execute;
    var i: Integer;
    begin
      i := 0;
      while i < 10 do
      begin
        Sleep(1);
        Inc(FCount);
        Synchronize(WriteFcout);
        InterlockedIncrement(ThreadLock);    if CenterThread.Suspended then
          CenterThread.Resume;
        Inc(i);
        Suspend;
      end;
    end;
      

  3.   

    并不是用了多线程就会提高程序的效率,如果不是多cpu,有时效率反而会降低
      

  4.   

    唤醒并不等于马上执行,只有请求到cpu时间才可能执行,感觉是两个线程同时请求,先处理哪个是不一定的,
      

  5.   

    补充
    邮箱:[email protected] 请发到邮箱,谢谢大家的参与