一个简单的多线程,在两个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.
源代码如下:
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.
解决方案 »
- 我用vc设计了一个dll,vc和vb能正常调用该库,delphi调用时老出错,请大家帮忙看看.
- 如何解析chm文件中每页的标题名?
- 说我的类残缺,帮忙看看是那里缺少东西啊?
- 什么是处理机?
- 高分求解,编译出现:[Error]Duplicate Resource(s);
- 如果我做了一个发票打印程序,如果换了一个打印机,会不会出现偏差?
- 为什么我打WinExec('c:\ID_List.chm',sw_restore);没有反应的啊,但是在windows的run里面却可以啊
- 谁能给我解决这问题, 一百分相赠
- 用delphi6做过web services的,进来看看,好吗?
- 大家看过来(学校机房管理),渴望大侠们的高见!
- 两个BMP图片合成问题
- 如何用程序修改计算机名,工作组名,IP,子网掩码,网关,DNS?请各位各身手
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.