以下代码
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 请问是什么原因
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 请问是什么原因
解决方案 »
- delphi做简单的售后服务管理系统。。。。。。
- 请问:我从登录界面转到主窗口后,要在主窗口点击重新登录,重新登录里的代码该怎么组织?
- 有关SQL数据库查询某条记录并且能定位的问题!
- 【Gabing Delva 第2篇】
- 求.关于ComboBox的一个高级用法
- 如何用delphi设置任务栏的高度?
- 请教高手:如何用Delphi创建一个空的Access数据库?谢谢!
- 大家好,问一个dbgrideh的下拉问题,有例程的话99分豪情相送
- 用NMSMTP控制编写一个发送邮件的小程序,出现"550 用户被锁定"的错误.
- 如何使用Windows的Cabinet.dll库?
- 请问各位大侠哪里有正版Delphi7经销商
- 在Delphi中什么报表工具有打印条型码的功能,或报表工具上怎么加载条型码控件
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;
邮箱:[email protected] 请发到邮箱,谢谢大家的参与