初学线程,遇上问题,特来请教前辈们。先行谢$ |
尚未結案
|
V8
一般會員 發表:1 回覆:1 積分:0 註冊:2003-05-02 發送簡訊給我 |
我想用 5 个线程产生 5 个不同的 [1..20] 的随机数,就写了这个 互斥同步 线程。
可得到的结果并不是我想要的 -- 有零。(为 BUG 更明显 我加了一句 sleep),前辈
们帮忙看看错在哪里? unit Main; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type ThreadRuning = class(TThread)
protected
procedure Execute;override;
end; TfrmMain = class(TForm)
btnGO: TButton;
procedure btnGOClick(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
public
{ Public declarations }
end; var
frmMain: TfrmMain; implementation {$R *.dfm}
const
ID = 5; var
PNumber: array [1..ID] of integer;
Flags : integer = 0;
DoneFlags : integer = 0;
hMutex: THandle = 0;
PWNuberSet: Set of 1..20; procedure ThreadRuning.Execute;
var
Number: integer;
LoopBool: boolean;
begin
LoopBool := True;
// Number := 0;
FreeOnTerminate := True;
OnTerminate := frmMain.ThreadsDone;
Inc(Flags);
while LoopBool do
begin
if WaitForSingleObject(hMutex,INFINITE) = WAIT_OBJECT_0 then
begin
Number := Random(20) 1;
if not(Number in PWNuberSet) then
begin
PNumber[Flags] := Number;
Include(PWNuberSet,Number);
LoopBool := false;
sleep(100);
end;//if
end;// if
end;// while
end; procedure TfrmMain.ThreadsDone(Sender: TObject);
var
i: integer;
begin
Inc(DoneFlags);
if DoneFlags = 5 Then
begin
for i := 1 to 5 do
ShowMessage(IntToStr(i) ' : ' IntToStr(PNumber[i]));
CloseHandle(hMutex);
ShowMessage('End');
end; // if
end; procedure TfrmMain.btnGOClick(Sender: TObject);
begin
Flags := 0;
DoneFlags := 0;
PWNuberSet := PWNuberSet * [];
Randomize; hMutex := CreateMutex(nil,false,nil);
ThreadRuning.Create(false);
ThreadRuning.Create(false);
ThreadRuning.Create(false);
ThreadRuning.Create(false);
ThreadRuning.Create(false);
end; end.
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |