全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2501
推到 Plurk!
推到 Facebook!

為何在線程中無法關閉程序?

答題得分者是:h@visli
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-04 09:53:33 IP:203.218.xxx.xxx 訂閱
procedure thread1;
begin
...
.......
if close=true then //當close為true時
begin
winexec(pchar(application.exename),sw_normal); //重啟自身程序
application.Terminate; //退出程序 //這一動作失效,程序沒有退出
end;
end;

h:=beginthread(nil,0,@thread1,nil,0,hid);

h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-04 10:02:12 IP:219.133.xxx.xxx 訂閱
你是要在當前App退出後, 再重新啟動這個App吧. 
你可以把這段退出重新開啟的代碼遷到Project代碼中執行. 如下面一樣:

<textarea class="delphi" rows="10" cols="60" name="code"> Application.Run; //在Application.Run後添加重啟代碼 if GlobalVarUnit.DoLoginOut then //這裡的GlobalVarUnit.DoLoginOut是個標記變量, 相當於你那個 //Close = True if ShellExecute(0, 'Open', PChar(ParamStr(0)), 'relogin', '', SW_SHOWNORMAL) <= 32 then Application.MessageBox( PChar(GB2Big5('对不起,执行注销时发生系统故障. 请在 LiveGPS 客户端退出后重新运行.') #13#10), PChar(GB2Big5(Format('注销失败(系统错误码:%d)', [GetLastError]))), 16);</textarea>

===================引 用 takdick 文 章===================
procedure thread1;
begin
...
.......
if close=true then //當close為true時
begin
winexec(pchar(application.exename),sw_normal); //重啟自身程序
application.Terminate; //退出程序 //這一動作失效,程序沒有退出
end;
end;

h:=beginthread(nil,0,@thread1,nil,0,hid);

------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-04 11:54:44 IP:203.218.xxx.xxx 訂閱
不,我是要在線程中關閉程序(不是退出線程),但上述代碼只能開啟多一個自身程序,卻沒有執行application.terminate;
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-05 16:35:13 IP:218.102.xxx.xxx 訂閱
煩請指教,謝謝.
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-07 16:52:16 IP:59.127.xxx.xxx 未訂閱
關閉程序是指?退出線程並關閉程式嗎?
===================引 用 takdick 文 章===================
不,我是要在線程中關閉程序(不是退出線程),但上述代碼只能開啟多一個自身程序,卻沒有執行application.terminate;
takdick
一般會員


發表:50
回覆:63
積分:22
註冊:2002-08-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-07 18:51:47 IP:203.218.xxx.xxx 訂閱
是的.
在線程裡好像無法直接關閉程序,只好新增一boolean,在另一過程裡判斷再退出.
是否有更好的辦法呢?
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-07 20:16:08 IP:211.74.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code">WinExec(Application->ExeName.c_str(),SW_NORMAL); SendMessage(Application->Handle,WM_CLOSE,0,0); </textarea>
使用SendMessage方式不知是否能符合您的需求,這是 BCB 的Code 您自行修改試試看
===================引 用 takdick 文 章===================
是的.
在線程裡好像無法直接關閉程序,只好新增一boolean,在另一過程裡判斷再退出.
是否有更好的辦法呢?
------
~§~迷時師渡,悟了自渡~§~
anyone
中階會員


發表:1
回覆:63
積分:52
註冊:2007-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-08 09:17:34 IP:59.127.xxx.xxx 未訂閱
若是new一個Thread的話
在Execute裡
<textarea class="delphi" rows="10" cols="60" name="code">procedure Execute(); begin while not self.Terminated do begin end; end; </textarea>
當收到Terminate
就會結束線程了。
不知道這是不是你要的答案
若在主要的程式,關閉的話
你試看看self.Close;
應該就能關掉了
===================引 用 takdick 文 章===================
是的.
在線程裡好像無法直接關閉程序,只好新增一boolean,在另一過程裡判斷再退出.
是否有更好的辦法呢?
編輯記錄
anyone 重新編輯於 2007-05-08 09:23:14, 註解 無‧
anyone 重新編輯於 2007-05-08 10:58:00, 註解 無‧
anyone 重新編輯於 2007-05-08 10:59:21, 註解 無‧
系統時間:2024-04-24 21:22:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!