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

Application.Terminate的使用時機

答題得分者是:wyndog
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-04 15:51:03 IP:61.71.xxx.xxx 未訂閱
請問各位!    我有一支DATAMODULES是20支FORM共用, 但其中有一個判斷成立的話(此判斷是寫在DATAMODULES上, 就必須關閉程式, 但我無法在程式上這樣寫    {$IFDEF FORM1} if  then form1.close {$ENDIF} {$IFDEF FORM2} if then form2.close {$ENDIF} ps:DATAMODULES 也沒有去USES FORM1, FORM2.... 所以我統用 if then Application.Terminate; 我想請問的是, Application.Terminate 雖然也是關閉一個應用程式, 但它屬於強制性的做法, 此動作一旦執行多了, 會不會造成怎樣的後遺症, 對於form的釋放後記憶體管理上有沒有什麼影響比較大的, 謝謝!
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-04 16:55:25 IP:60.248.xxx.xxx 未訂閱
我個人是認為不會有問題 所有的 Form 其實都是 Application Create 出來的 Terminate 還是屬於 Applcation 的 Method 也就是說,當我們呼叫 Terminate 來結束程式時 Application 會幫我們處理好所有的收尾動作才是
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-04 17:31:54 IP:61.222.xxx.xxx 未訂閱
事實上視窗本身就是一個消息機制 procedure TApplication.Terminate; begin if CallTerminateProcs then PostQuitMessage(0); end; 從這一點可以看出其並非強制性終止程式。 但是否有無正確的釋放物件。嗯!是有待商榷的。 一般而言,個人所開發軟體。 推出前,我都會利用類似 Memproof 的工具檢測程式 進行檢測是否有無正確釋放指針或是物件等等。 提供給你做為參考。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-07 21:21:13 IP:218.18.xxx.xxx 未訂閱
基本上,每个FORM里需要在关闭FORM前释放的东西,大概你都会写在 OnFormClose里面吧。 那么,你可以在FormClose里写一段代码,当Form Close的时候,由这段代码写log到file里去。 然后,你做 Application.Terminate,然后,看看log file,有没有执行到form close. 如果有,那么,和正常的一个一个的Form的关闭,就没区别了。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-07 21:50:02 IP:219.68.xxx.xxx 未訂閱
引言: 基本上,每个FORM里需要在关闭FORM前释放的东西,大概你都会写在 OnFormClose里面吧。 那么,你可以在FormClose里写一段代码,当Form Close的时候,由这段代码写log到file里去。 然后,你做 Application.Terminate,然后,看看log file,有没有执行到form close. 如果有,那么,和正常的一个一个的Form的关闭,就没区别了。
我想這是無庸置疑的, 即已Application.Terminate 程式到此會結束這支系統, 並不會去run其他東東, 所以我會說它是強制性的中斷, 也因此才想知道close與terminate的內涵有何差異性, help中說得好少!
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-09 11:32:40 IP:60.248.xxx.xxx 未訂閱
我查了一下 Delphi Help 在 TApplication.Terminate 裡有一段話是這樣寫的 Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate. Terminate is called automatically on a WM_QUIT message and when the main form closes. 所以可以推定,Terminate 其實只是送 WM_QUIT 給 Application 而已,並不是強制性地結束 事實上,我實驗了一下,跑個無窮迴圈就讓 Terminate 破功了 那麼再來的問題就是,Terminate 有沒有釋放掉該釋放掉的物件? 根據翻 Source 的結果,發現 Terminate 會呼叫 MainForm.Close 所以,可以確定 MainForm 是會結束的,另外一點比較奇怪的是,為什麼 MainForm 的 OnClose 沒辦法攔下 Terminate 這點我還沒研究出來 另外,實驗了一下,也確定 DataModule 會隨著 Terminate 而釋放的 Terminate 時,DataModule 的 OnDestory 會正常作用 至於 MainForm 的 OnClose 就不知為何無法作用 所以,若是真的有東西要在 MainForm 的 OnClose 裡釋放的話 就自己寫一個釋放函數
function MyTerminateProc: boolean;
begin
  // 釋放你的物件
  return true; // 這個 True 是釋放作業正常時,規定要傳回 True 的
end;    // 在程式的適當地方加上
AddTerminateProc(MyTerminateProc);
這樣,你只要呼叫 Terminate,Delphi 都會幫你呼叫 MyTerminateProc
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-10 22:39:16 IP:219.68.xxx.xxx 未訂閱
感謝 reptile 這麼詳細的測試, 熊熊看到旁邊的個人資料, 以reptile的年齡有如此經歷令人折服, 開個玩笑啦, 不要見怪哦!
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-11 12:05:55 IP:61.218.xxx.xxx 未訂閱
to P.D.: 原則上來說,如果你的程式是屬於"正常結束"的,那麼就是呼叫 Application.Terminate,如果程式結束是屬於"不正常結束",那麼可以呼叫Halt procedure.至於是否強制結束或記憶體釋放不完全,個人是認為不予理會,因為即使連VCL本身,也有很多的記憶體釋放不完全的,再者,user的PC上常會安裝些有的沒有的軟體,在在都會影響效能,所以,只要你的application不是那麼不穩固,我想應該都ok吧.
系統時間:2024-04-27 11:37:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!