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

如何終止一個正在執行中的函數?

尚未結案
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-12 11:21:18 IP:61.57.xxx.xxx 未訂閱
目前我寫了一個函數,全部執行結束要花一分多鐘,因些想寫一個按鈕讓使用者可以中途停止,想到了兩個方法: 1. 加上一個停止的旗標,之後在這個函數的每一行都去判斷旗標是否設為停止,若是則return,但這個寫法很爛,因為函數不是一個迴圈,所以必須只好在每一行去判斷。 2. 用thread,將這個函數用thread是實現它,若使用者按下停止鈕,則將thread終止,可是現在卻不知道要如何讓thread終止?只知道Resume()跟Suspend()的用法,看了站上的例子都是一些迴圈,像while(!Terminated),再用Terminate()去終止它,可是我的函數並非迴圈,想請教一下站上的大大,我該如何作呢?感激不盡!   
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-12 17:48:40 IP:211.76.xxx.xxx 未訂閱
引言: 目前我寫了一個函數,全部執行結束要花一分多鐘,因些想寫一個按鈕讓使用者可以中途停止,想到了兩個方法: 1. 加上一個停止的旗標,之後在這個函數的每一行都去判斷旗標是否設為停止,若是則return,但這個寫法很爛,因為函數不是一個迴圈,所以必須只好在每一行去判斷。 2. 用thread,將這個函數用thread是實現它,若使用者按下停止鈕,則將thread終止,可是現在卻不知道要如何讓thread終止?只知道Resume()跟Suspend()的用法,看了站上的例子都是一些迴圈,像while(!Terminated),再用Terminate()去終止它,可是我的函數並非迴圈,想請教一下站上的大大,我該如何作呢?感激不盡! < face="Verdana, Arial, Helvetica"> hornacek你好 第二個方法在實作上和第一個方法其實也大同小異,要在Execute()中穿插數個if(Terminated)return;判斷式(這麼看來,第一個方法和第二個方法,只差在有沒有用到TTread),我記得bcb的help是這麼寫的...不知道還有沒有更高明的作法呢?
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-13 14:23:19 IP:211.23.xxx.xxx 未訂閱
thread可隨時用Terminate()去終止它, 在停止鈕加入thread->Terminate();即可。    Suspend()是暫停一個thread, Resume()是讓暫停的thread繼續執行。    thread可隨時使用Suspend(),Resume(),Terminate()。 詳見MSDN 說明。 或參考:【問題】請問如何叫醒另一個
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-13 17:50:56 IP:211.76.xxx.xxx 未訂閱
引言: thread可隨時用Terminate()去終止它, 在停止鈕加入thread->Terminate();即可。
anpino你好: 請問你用的是TThread嗎?WIN API只有TerminateThread,沒有Terminate,用法也不同。請問是要找MSDN中找那一篇文章呢? 如果是TThread的Terminate()就我所知,如果沒在Execute中檢查Terminated變數並return。Terminate()是沒有作用的。並不是停止鈕中加入thread->Terminate();即可。 void __fastcall Terminate(void); Description Terminate sets the thread? Terminated property to true, signaling that the thread should be terminated as soon as possible. For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true. 發表人 - pwipwi 於 2004/05/13 18:03:16
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 08:40:02 IP:211.23.xxx.xxx 未訂閱
引言: anpino你好: 請問你用的是TThread嗎?WIN API只有TerminateThread,沒有Terminate,用法也不同。請問是要找MSDN中找那一篇文章呢? 如果是TThread的Terminate()就我所知,如果沒在Execute中檢查Terminated變數並return。Terminate()是沒有作用的。並不是停止鈕中加入thread->Terminate();即可。
pwipwi你好: 謝謝你的指導&提醒。 我都是用 > ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-14 19:00:43 IP:61.63.xxx.xxx 未訂閱
原來如此,那這樣說來Borland包的那個thread,其實功能很遜囉!因為之所以要用thread就是希望能隨時停止它,若還要去判斷Terminated這個屬性的話,實在是有些多此一舉,那只好來研究研究API的thread似乎比較有意義...謝啦!
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-17 08:21:17 IP:211.23.xxx.xxx 未訂閱
引言: 原來如此,那這樣說來Borland包的那個thread,其實功能很遜囉!因為之所以要用thread就是希望能隨時停止它,若還要去判斷Terminated這個屬性的話,實在是有些多此一舉,那只好來研究研究API的thread似乎比較有意義...謝啦!
不客氣。< > 重新包裝並不代表很遜啦< >, 只是比較user friendly而已。缺點是掌控性不高。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D ------------------------------- 發表人 - anpino 於 2004/05/17 08:48:27
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-17 08:55:29 IP:61.57.xxx.xxx 未訂閱
引言: thread可隨時用Terminate()去終止它, 在停止鈕加入thread->Terminate();即可。 Suspend()是暫停一個thread, Resume()是讓暫停的thread繼續執行。
想再請教一個問題? thread 的Suspend()是把Execute()做完之後才停止?還是不管做到哪裡,立刻停止呢?若是第二個,它是如何記憶做到哪?謝謝!
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-17 10:22:26 IP:211.23.xxx.xxx 未訂閱
引言: 想再請教一個問題? thread 的Suspend()是把Execute()做完之後才停止?還是不管做到哪裡,立刻停止呢?若是第二個,它是如何記憶做到哪?謝謝!
還是不管做到哪裡,立刻停止。 組語中stack的觀念。 將目前執行的位址紀錄下來(丟到stack裡), 當resume時,再將位址從stack取出,由該位址繼續執行。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-17 13:05:34 IP:210.243.xxx.xxx 未訂閱
引言:
引言: 想再請教一個問題? thread 的Suspend()是把Execute()做完之後才停止?還是不管做到哪裡,立刻停止呢?若是第二個,它是如何記憶做到哪?謝謝!
還是不管做到哪裡,立刻停止。 組語中stack的觀念。 將目前執行的位址紀錄下來(丟到stack裡), 當resume時,再將位址從stack取出,由該位址繼續執行。 < face="Verdana, Arial, Helvetica"> 原來如此~~~謝謝兩位大大的指導...
系統時間:2024-05-18 16:23:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!