1. 程式人生 > >在delphi中如何判斷執行緒終止

在delphi中如何判斷執行緒終止

能不能判斷執行緒的狀態,是執行,還是掛起呀?怎樣得知執行緒結束了?
我做了一個執行緒佇列,用佇列管理執行緒,可是無法得知哪個執行緒是否結束了,然後讓結束了的執行緒重新啟動?
Obj: TQueryThread
用delphi的TThread類實現
用什麼方法可知執行緒結束了,我用執行緒控制代碼,有的執行緒結束了,但控制代碼不是0
請問用什麼方法判斷執行緒結束了?然後重啟結束的執行緒

樓上的一些方法都說了,我多說一點

根據WIN32平臺核心物件的一些原則

執行緒在仍然活動時,核心物件處於未通知狀態,執行緒中止時,處於通知狀態,所以可以根據執行緒控制代碼配合等待函式來做

給你寫了一個例子:隨手寫的程式碼,僅用來演示,實際使用時要注意一些細節。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TTestThread=class(tthread)//被測試執行緒,僅僅是將窗體的caption從0變到10000
protected
procedure Execute;override;
end;
TmThread = class(tthread)//檢測執行緒,當被側執行緒中止時,顯示一個對話款
protected
procedure Execute;override;
end;

var
Form1: TForm1;
t : TTestThread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
t := TTestThread.Create(false);
TmThread.Create(false);
end;

{ TTestThread }

procedure TTestThread.Execute;
var
i : integer;
begin
FreeOnTerminate := true;
for i := 0 to 10000 do
Form1.Caption := Format('%d',[i]);

end;

{ TmThread }

procedure TmThread.Execute;
begin
if WaitForSingleObject(t.Handle,INFINITE)=WAIT_OBJECT_0 then
ShowMessage('執行緒已經中止');

end;

end.  

delphi 執行緒作了封裝哦, 不但可以在 windows 平臺下跑, 也能在 linux 下跑的, 好的程式碼不要去用 API, TThread 本身封裝了些屬性, 這樣裝了 crossKyrix 後, 可以直接編譯成 linux 執行檔案

property Suspended 暫停
property Terminated 中止
function WaitFor 阻塞等執行緒結束, 代替 WaitForSingleObject, 返回結果是相同的

看到前面提到 FreeOnTerminate 應小注意一下, 這種執行緒是不受控的, 一般是那種暫態的, 做完後不需去了解狀態的執行緒, FreeOnTerminate = true 時, 執行緒屬性是不應該去訪問的,在建立時設什麼就是什麼, 因為執行緒隨時可能被釋放, 因此極難作收集管理用

相關推薦

delphi如何判斷執行終止

能不能判斷執行緒的狀態,是執行,還是掛起呀?怎樣得知執行緒結束了? 我做了一個執行緒佇列,用佇列管理執行緒,可是無法得知哪個執行緒是否結束了,然後讓結束了的執行緒重新啟動? Obj: TQueryThread 用delphi的TThread類實現 用什麼方法可知執行緒結束了,我用執行緒控制代碼,有的執行緒結

Delphi執行Synchronize的運用

Delphi中多執行緒用Synchronize實現VCL資料同步顯示,Delphi中多執行緒用Synchronize實現VCL資料同步顯示轉自:http://blog.csdn.net/maxcode/archive/2006/05/12/726766.aspx 概述:   

Java如何正確而優雅的終止執行執行

Java中終止執行緒的方式主要有三種: 1、使用stop()方法,已被棄用。原因是:stop()是立即終止,會導致一些資料被到處理一部分就會被終止,而使用者並不知道哪些資料被處理,哪些沒有被處理,產生

java 執行池 ExecutorService shutdonw及其多執行執行完成判斷

1.線上程池 ExecutorService的使用過程中,主執行緒開啟了多個子執行緒,如果判斷所有子執行緒任務是否完成問題; 方法一: BusinessHandler b = new Busines

spring boot定時任務新建執行如何做到可控終止

最近遇到這樣的需求,要求是定時的執行任務,但是這些任務能夠根據控制及時的停止。 首先定時任務可以直接使用spring中的schedule註解方式實現。那麼如何控制已經啟動的任務及時停止呢? 下面說一下思路。首先利用spring的schedule註解方式進行定時任務的執

delphi判斷執行狀態函式

來源:https://www.cnblogs.com/azhqiang/p/3955490.html//判斷執行緒是否釋放//返回值:0-已釋放;1-正在執行;2-已終止但未釋放;//3-未建立或不存在function CheckThreadFreed(aThread: TT

ExecutorService 關閉 and 如何判斷執行任務執行完畢

ExecutorService 關閉1、shutdown 2、shutdownNow 3、awaitTermination當你使用ExecutorService的時候,你應該記得關閉它,這樣這些被管理的執行緒才會停止執行。舉例:如果你的應用通過main()方法啟動,並且你的

top、ps命令檢視程序執行方法

方法一:PS ps -a顯示所有程序pid,“-T”選項可以開啟執行緒檢視。 eg: ps -aT 顯示所有執行緒 方法二: Top top用於實時檢視各個執行緒情況,用top命令的“-H”選項,該選項會列出所有Linux執行緒。 eg1. top -H 所有執行緒 eg2.

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Spring 執行安全性

Spring與執行緒安全   Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。   Spring對每個bean提供了一個s

Qt實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

觀察者模式執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

Java語言執行安全

執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可

MFC開啟執行

MFC標頭檔案中編寫:分檔案類外定義的資料   public: //執行緒 BOOL m_bThread; 再MFC的初始化中,編寫如下程式碼 //_建立執行緒 AfxBeginThread(ThreadProc,(LPVOID)this); m_bThread=

Java停止執行

一.停止執行緒會帶來什麼? 對於單執行緒中,停止單執行緒就是直接使用關鍵字return或者break,但是在停止多執行緒時是讓執行緒在完成任務前去開啟另外一條執行緒,必須放棄當前任務,而這個過程是不可預測,所以必須去做好防備。 二.認識停止執行緒的幾個方法  2.1三個被棄用的

Spring4.x執行使用

直接上程式碼: 一:配置類 import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springfram

powerbuilder 使用執行的方法

//宣告物件變數  ccuo_thread lccuo_thread  //建立新執行緒  SharedObjectRegister ('ccuo_thread' ,'thread_center' )  //引用例項  SharedObje

Android執行執行

執行緒與執行緒池 概括 執行緒分為主執行緒和子執行緒. 主執行緒主要是用來處理和介面相關的事情, 子執行緒主要是用來做耗時的操作,比如 載入遠端資料,資料庫操作等。 在android 中,處理直接使用 Thread以外。 android 還提供了很多類似執行緒的操作便於我們

java執行一定快嗎?看完就知道!!!

理解上下文切換   即使是單核處理器也支援多執行緒執行程式碼,CPU通過每個執行緒分配CPU時間片來實現這個機制.時間片是CPU分配給多個執行緒的時間,因為時間片非常短,所以CPU通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms).  

深入理解Java停止執行

一.停止執行緒會帶來什麼? 對於單執行緒中,停止單執行緒就是直接使用關鍵字return或者break,但是在停止多執行緒時是讓執行緒在完成任務前去開啟另外一條執行緒,必須放棄當前任務,而這個過程是不可預測,所以必須去做好防備。 二.認識停止執行緒的幾個方法  2.1三個被棄用的方法 &n