多线程不能正确显示的问题

ysgs129 2009-02-13 05:33:34
一个简单的多线程,在两个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.
...全文
75 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysgs129 2009-02-13
  • 打赏
  • 举报
回复
具体怎么修改啊
ysgs129 2009-02-13
  • 打赏
  • 举报
回复
具体怎么修改啊
zshsuming 2009-02-13
  • 打赏
  • 举报
回复
学习``
xiaocongzhi 2009-02-13
  • 打赏
  • 举报
回复
一般多线程都要做好同步的问题
pathletboy 2009-02-13
  • 打赏
  • 举报
回复
SyncObjs TCriticalSection
coderee 2009-02-13
  • 打赏
  • 举报
回复
学习。
mdejtod 2009-02-13
  • 打赏
  • 举报
回复
用临界区保护,再在线程中同步,保证你没问题
simonhehe 2009-02-13
  • 打赏
  • 举报
回复

unit utMutex;

interface

uses
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.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧