為什麼我寫的執行序,跑一半關掉會錯 |
答題得分者是:hagar
|
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
程式說明:按鈕1按下能同時兩個數字一起跑,但是在跑的時候,關閉時就會出現錯誤,錯誤的意思是我的主form關了,執行序還用到主form的label所以出現錯誤,
但我我看範例,DELPHI裡面的排序法用thread的跑的是沒有問題,我的卻有問題,覺得好像他是用畫圖所以沒差,而我這樣不行,不知有沒有大大會解決我的問題的。 程式: 先加入2個button,2個Label,並在2個button加入事件 unit1 為主form [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AppEvnts; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Button2: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure ThreadDoe(Sender: TObject); procedure ThreadDoe1(Sender: TObject); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.ThreadDoe(Sender: TObject); begin //Dec(ThreadsRunning); //減到為0又可以可以重跑 Button1.Enabled := True; //Thread跑完後 end; procedure TForm1.ThreadDoe1(Sender: TObject); begin //Dec(ThreadsRunning); //減到為0又可以可以重跑 Button2.Enabled := True; //Thread跑完後 end; procedure TForm1.Button1Click(Sender: TObject); var fund_name : string; sn : integer; begin button1.enabled:=false; //TDownLoad.Create.OnTerminate := ThreadDoe; fund_name := 'kobe1'; sn := 100000; TinFund.Create(Label1, fund_name, sn).OnTerminate := ThreadDoe; button2.enabled:=false; sn := 500000; ToutFund.Create(Label2, fund_name, sn).OnTerminate := ThreadDoe1; end; procedure TForm1.Button2Click(Sender: TObject); var fund_name : string; sn : integer; begin button2.enabled:=false; sn := 5000000; ToutFund.Create(Label2, fund_name, sn).OnTerminate := ThreadDoe1; end; end. [/code] unit2 為一個thread [code delphi] unit Unit2; interface uses Classes, StdCtrls, SysUtils, Windows, Messages, Dialogs; type TMyThread = class(TThread) private num : integer; Lb1 : TLabel; protected procedure calculate(A: Integer); virtual; abstract; procedure Execute; override; public constructor Create(lbc: TLabel; fund_name : string; sn:integer); end; TinFund = class(TMyThread) protected procedure calculate(C : Integer); override; end; ToutFund = class(TMyThread) protected procedure calculate(C : Integer); override; end; implementation uses Unit1; constructor TMyThread.Create(lbc: TLabel; fund_name : string; sn:integer); begin Lb1 := TLabel.Create(nil); num := sn; Lb1 := lbc; FreeOnTerminate := True; inherited Create(False); end; procedure ToutFund.calculate(C : Integer); var i : integer; begin for i:=1 to C do begin if Terminated then Exit; Lb1.caption := inttostr(i); end; ShowMessage('kobe'); end; procedure TinFund.calculate(C : Integer); var i : integer; begin for i:=1 to 5000 do begin if Terminated then Exit; Lb1.caption := inttostr(i); end; end; procedure TMyThread.Execute; begin calculate(num); end; end. [/code] 編輯記錄
17kobe 重新編輯於 2007-11-23 15:53:06, 註解 無‧
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
關於這一段:
constructor TMyThread.Create(lbc: TLabel; fund_name : string; sn:integer); begin Lb1 := TLabel.Create(nil); num := sn; Lb1 := lbc; FreeOnTerminate := True; inherited Create(False); end; Lb1 := TLabel.Create(nil); 已經建立了一個 TLabel, 並把這 TLabel 的指標給 Lb1 但接下來又把 lbc 所指向的 TLabel 給 Lb1 那原先 Lb1 所指向的 TLabel 便失去了 另外 Lb1.caption := inttostr(i); 這行之前可以用 if Assigned(Lb1) then 來判斷 Lb1 還存不存在 還存在才做動作 |
17kobe
初階會員 發表:86 回覆:73 積分:31 註冊:2007-07-30 發送簡訊給我 |
加if Assigned(Lb1) 這一行,也是偶爾會出錯,可能有時候跑到下一行才失去
請問還有沒有辦法前面指標方法改變寫法。 ===================引 用 hagar 文 章=================== 關於這一段: constructor TMyThread.Create(lbc: TLabel; fund_name : string; sn:integer); begin Lb1 := TLabel.Create(nil); num := sn; Lb1 := lbc; FreeOnTerminate := True; inherited Create(False); end; Lb1 := TLabel.Create(nil); 已經建立了一個 TLabel, 並把這 TLabel 的指標給 Lb1 但接下來又把 lbc 所指向的 TLabel 給 Lb1 那原先 Lb1 所指向的 TLabel 便失去了 另外 Lb1.caption := inttostr(i); 這行之前可以用 if Assigned(Lb1) then 來判斷 Lb1 還存不存在 還存在才做動作 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |