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

強迫結束某 Form

尚未結案
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-24 00:36:29 IP:211.21.xxx.xxx 未訂閱
請問各位長官 在同一行程內,Form1 呼叫出 Form2 後 當 Form2 run 一無窮回圈 , Form1 該如何強迫 Form2 結束掉 ?? 像是直接砍掉另一行程依樣乾淨俐落,可惜現是在同一 exe 中 送 Form2.close , form2.free , 都是無效的 迴圈內我無法動手腳,因為本例是實際案例的雛型,不考慮去更動別人的程式內部 (迴圈內部甚至連 Application.ProcessMessage 都沒有) 發表人 - bruce0211 於 2004/09/24 01:00:29
wameng
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-24 01:05:13 IP:61.31.xxx.xxx 未訂閱
PostMessage(Form2.Handle,WM_CLOSE,0,0); 由於單一行程 可能連Process 都抽不出空來。 只能在呼叫 Form2 之前 建立一任務 Thread 強制將該 Form2 結束 發表人 - wameng 於 2004/09/24 01:11:32
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-24 11:53:12 IP:203.73.xxx.xxx 未訂閱
引言: PostMessage(Form2.Handle,WM_CLOSE,0,0); 由於單一行程 可能連Process 都抽不出空來。 只能在呼叫 Form2 之前 建立一任務 Thread 強制將該 Form2 結束 發表人 - wameng 於 2004/09/24 01:11:32
好吧 ~ 假設迴圈內有 application.procemessage 但 PostMessage(Form2.Handle,WM_CLOSE,0,0); 是我第一個試過沒用的方法
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-24 11:58:48 IP:203.73.xxx.xxx 未訂閱
好吧 ~ 假設迴圈內有 application.procemessage 但 PostMessage(Form2.Handle,WM_CLOSE,0,0); 是我第一個試過沒用的方法 迴圈仍繼續繞,跟本不理我 送 WM_QUIT 是可強制 , 但強制到整個 AP (連 FORM1)都結束 我只要強制結束 form2
wameng
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-24 12:08:13 IP:61.222.xxx.xxx 未訂閱
-->PostMessage(Form2.Handle,WM_CLOSE,0,0); 當然我不報任何希望 PostMessage form2 能夠聽到。 所以我建議用 執行緒 的方式來解決
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-24 15:14:23 IP:220.135.xxx.xxx 未訂閱
Hi bruce0211 先進你好: 有沒有想過在迴圈裡面設一個變數, Form1直接去改那個變數即可? 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-24 23:19:27 IP:211.21.xxx.xxx 未訂閱
引言: Hi bruce0211 先進你好: 有沒有想過在迴圈裡面設一個變數, Form1直接去改那個變數即可? 我不是高手, 高手是正在銀幕前微笑的人.
迴圈內我無法動手腳,因為本例是實際案例的雛型,不考慮去更動別人的程式內部 砍行程(另一 exe 檔),是可以乾淨俐落(像是工作管理員強制結束一 BUSY 的程式) 但同一 AP 中 FORM1 (主選單)要砍 FORM2 (子業務)原來真的是沒有強制立即的方法 >_<~~~~ 發表人 - bruce0211 於 2004/09/24 23:28:36
wameng
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-25 02:14:36 IP:61.31.xxx.xxx 未訂閱
事實上,我覺得跟 Form1、Form2沒有關係。 Form2 的事件,又沒釋放 ProcessMessage及引用變數判斷 Process 當然忙碌。並且造成畫面當掉的假現象。 這個問題我試一下 用 Thread 去強制釋放。 但是沒用! 主要又回歸原點,Process Always Busy 。 根本不收到任何訊息,就連強制 Destory 都wait在那裡。 我曾經想過用 WaitForDebugEvent 方式。 暫停 Process 並插入處理 再繼續 不過,我沒去試!想來也是太累了。 後來,我覺得應該是無解。 除非將 Form2 獨立為單一 Process 這樣又違背了題目的宗旨了! 看來!難了
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-25 19:27:21 IP:211.21.xxx.xxx 未訂閱
當多人開發環境下使用 dll 或是 bpl 架構 整個系統只有一個主要 exe 檔,其它子業務都是 dll 或是 bpl 有某些情況必須強制立即結束子業務回到主選單時 就有此種問題的存在 相信大家都有機會在未來碰到 希望各位長官還能繼續提供解決此問題的意見..謝謝
shieh2700
高階會員


發表:0
回覆:127
積分:100
註冊:2002-06-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-29 02:10:28 IP:61.229.xxx.xxx 未訂閱
假若某支子程式會有無窮迴圈的狀況,且主程式無法終結此支子程式的運作,顯然此支子程式的邏輯是有問題的,站在品質控管的立場上,此支子程式應該改寫或重寫,不然將來必定會是個不定時炸彈(例: Memory leak )。 個人淺見... (可否請教個問題,除了有不良意圖的程式或寫錯的程式以外,有什麼樣的功能會需要用到一個無法終止的無窮迴圈?)
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-06 18:56:33 IP:210.64.xxx.xxx 未訂閱
我試過, 如果動態 Create Form, 迴路中有 Application.ProcessMessage 可以直接用 Form.Free 雖會出現 Exception Error, 但確實可終止 該無窮迴圈的 Form.
John Wong
初階會員


發表:1
回覆:35
積分:32
註冊:2004-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-08 04:40:01 IP:218.103.xxx.xxx 未訂閱
我認為解決的方法有3種. 1. 最直接的當然是開一條新的thread去執行form2的無窮迴圈, 到要結束它時便把它terminate, 甚至kill了它. 2. 不開一個新thread去執行, 自然就只有用main thread去執行, 把main thread結束當然是不可行, 唯有利用Application.ProcessMessage, 在form2的無窮迴圈中加入如TThread的terminate機制去終止執行. 3. 若不想加入方法2的機制, 還可以取巧一點, 令它執行時產生error, 改變form2中的一些property令其執行時產生error, 用form2.free亦可, 但出來的error可能較嚴重. 其實我從未用過Application.ProcessMessage, 一般都是開一條thread或timer來執行. 若堅持要用main thread執行, 又不加入讓其終止的機制, 又不想用error來終止它, 實在想不到還有甚麼可行的方法.
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-01-27 14:32:09 IP:210.202.xxx.xxx 未訂閱
試試看這個,我不確定有沒有用!特別注意到紅色的部分!    The DefWindowProc function calls the default window procedure to provide default processing for any window messages that an application does not process. This function ensures that every message is processed. DefWindowProc is called with the same parameters received by the window procedure. LRESULT DefWindowProc( HWND hWnd, // handle to window UINT Msg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); Parameters hWnd Identifies the window procedure that received the message. Msg Specifies the message. wParam Specifies additional message information. The content of this parameter depends on the value of the Msg parameter. lParam Specifies additional message information. The content of this parameter depends on the value of the Msg parameter. Return Values The return value is the result of the message processing and depends on the message. Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-01-27 15:09:29 IP:218.90.xxx.xxx 未訂閱
可以这么做 if 条件满足 then Form2.Free;
系統時間:2024-05-08 21:13:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!