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

為什麼我寫的執行序,跑一半關掉會錯

答題得分者是:hagar
17kobe
初階會員


發表:86
回覆:73
積分:31
註冊:2007-07-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-23 15:51:32 IP:60.250.xxx.xxx 訂閱
程式說明:按鈕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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-23 19:53:35 IP:59.124.xxx.xxx 未訂閱
關於這一段:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-26 15:29:33 IP:60.250.xxx.xxx 訂閱
加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 還存不存在
還存在才做動作
系統時間:2024-04-20 2:55:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!