線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:688
推到 Plurk!
推到 Facebook!

初学线程,遇上问题,特来请教前辈们。先行谢&#36

尚未結案
V8
一般會員


發表:1
回覆:1
積分:0
註冊:2003-05-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-11 21:39:20 IP:218.15.xxx.xxx 未訂閱
我想用 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-12 11:36:59 IP:218.85.xxx.xxx 未訂閱
問題有可能是Sleep引起的,因為Sleep會掛起線程而可能導致該線程出現混亂, 在我這邊測試:去掉Sleep(100)語句則會得到正常的結果。
系統時間:2024-05-20 9:19:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!