這個問題涉及到Delphi和XE特別反對Suspend和Resume。我已經閱讀過其他文章,到目前爲止我還沒有找到類似的用法,所以我會繼續討論。當Delphi不需要並且安全地恢復時,在Delphi中自行掛起一個線程
我想知道有什麼更好的方法來暫停一個線程時,它不需要?
我們有一個Delphi類,我們已經使用了多年,基本上它是一個與線程進程相關聯的FIFO隊列。隊列接受主線程上的數據對象,並且如果線程被掛起,它將恢復它。
作爲線程的Execute進程的一部分,該對象被彈出隊列並在線程上處理。通常這是做一個數據庫查找。
在進程結束時,對象的屬性被更新並標記爲可用於主線程或傳遞到另一個隊列。執行過程的最後一步(也就是它的第一步)是檢查隊列中是否還有其他項目。如果它繼續存在,否則它會暫停。
它們的關鍵是唯一掛起的動作是在Execute循環中完成時的,當正常操作期間的唯一恢復被稱爲新的項目放入隊列時。例外情況是隊列類正在被終止。
恢復功能看起來像這樣。
process TthrdQueue.MyResume();
begin
if Suspended then begin
Sleep(1); //Allow thread to suspend if it is in the process of suspending
Resume();
end;
end;
的執行類似於這樣
process TthrdQueue.Execute();
var
Obj : TMyObject;
begin
inherited;
FreeOnTerminate := true;
while not terminated do begin
if not Queue.Empty then begin
Obj := Pop();
MyProcess(Obj); //Do work
Obj.Ready := true;
end
else
Suspend(); // No more Work
end; //Queue clean up in Destructor
end;
的TthrdQueue推入堆棧增加另一個對象後,程序調用MyResume。如果線程暫停,MyResume只會調用Resume。
當關閉時,我們將終止設置爲true,並在掛起時調用MyResume。
我不是專家,但我只是簡單地使用Sleep(250)或SignalObjectAndWait(請參閱msdn)進行更精確的控制。 – 2010-12-09 18:04:50