問題1:關于執行緒的創建
我使用的創建方法是:
Thread1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
然后在Thread1.Execute中寫實作程序,直接使用Thread1.create創建
那么這樣創建的話我能獲取創建執行緒的句柄嗎?如果我想要強制關閉此執行緒該怎么辦??
問題2:執行緒強制終止會有什么影響??
問題3:terminatethread和terminate函式怎樣終止執行緒??假如執行緒在while回圈中,能終止嗎?
總共3個問題,一個50分,希望各位大神幫我解惑,謝謝了
uj5u.com熱心網友回復:
我的想法是在主界面里宣告全域執行緒物件變數,這樣隨時可以用這個實體。啟動執行緒后,如果需要中斷,則在執行緒的EXECUTE方法里的回圈體中增加判斷,如果被打斷則跳出。uj5u.com熱心網友回復:
typeTTdownLoadThread = class(TThread)
protected
procedure Execute:override;
end;
...
var
tDownLoad : TTdownLoadThread;
....
implementation
procedure TForm1.Button1Click(Sender:TObject);
begin
tDownLoad := TTdownLoadThread.create(false);
...
tDownLoad .resume;
end;
..........
procedure TTdownLoadThread.Execute;
begin
FreeOnTerminate := true;
while xxx do
begin
if 被打斷 then break;//這里不會寫了。
end;
end;
uj5u.com熱心網友回復:
while not Terminated do...
uj5u.com熱心網友回復:
給一個實體,僅代參考:unit LongWaitTrd;
interface
uses Classes,Windows,Messages,SyncObjs;
type TLongWaitTrd = class(TThread)
private
FMainWin:THandle;
QuitEvent: TEvent;
procedure SendFeedBackToMainWin();
procedure DoTheHardWork();
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean); destructor Destroy; override;
function ExitLongWaitTrd():Boolean;
published
property MainWin:THandle read FMainWin write FMainWin;
end;
implementation
uses Unit1;
constructor TLongWaitTrd.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;
destructor TLongWaitTrd.Destroy;
begin
inherited;
end;
procedure TLongWaitTrd.DoTheHardWork();
begin
//to do
end;
procedure TLongWaitTrd.Execute;
var Msg: TMsg;
begin
FreeOnTerminate:=True;
// 1.長等待型執行緒示例
// while GetMessage(Msg, 0, 0, 0) do
// begin
// if (Msg.message=WM_USER+1000) then //任務來了
// begin
// DoTheHardWork();
// SendFeedBackToMainWin;
// end;
// if (Msg.message=WM_QUIT) then
// begin
// QuitEvent.SetEvent;
// Break;
// end;
// end;
// 2.長作業型執行緒示例
// while(true) do
// begin
// if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
// begin
// if (Msg.message=WM_QUIT) then
// begin
// QuitEvent.SetEvent;
// Break;
// end;
// end;
// DoTheHardWork();
// end;
end;
function TLongWaitTrd.ExitLongWaitTrd;
begin
Result:=true;
QuitEvent:=TEvent.Create(nil,True,False,'QuitEvent');
PostThreadMessage(ThreadID,WM_QUIT,0,0);
if (QuitEvent.WaitFor(2000)=wrTimeOut) then
Result:=false;
QuitEvent.Free ;
end;
procedure TLongWaitTrd.SendFeedBackToMainWin();
var Status:String;
begin
if (MainWin<>0) then
begin
Status:='The data has been processed by thread.';
PostMessage(MainWin,WM_USER+2000,0,Integer(Status))
end;
end;
end.
uj5u.com熱心網友回復:
LS的老大,學到了一招,感謝
uj5u.com熱心網友回復:
感謝各位大神,關于標志位讓執行緒退出的方法我早就用過了,只是某些特殊情況下不太好用,比如我在執行緒中接收TCP收到的訊息,使用控制元件接收是阻塞方式,或者后面需要大量時間來處理其他函式,那么,回圈回來判斷標志位中間時間間隔就有點太長了,所以在想強制執行緒退出的方法,還有強制執行緒退出有什么缺陷或者不好的影響嗎??uj5u.com熱心網友回復:
關于4樓的例子,由于我對訊息的方式不太了解,所以還沒有嘗試,不過我創建執行緒的方式不是直接用API函式,所以沒辦法得到句柄,還有其他好辦法嗎??順便給我講講強制結束執行緒會有什么不好吧!!!uj5u.com熱心網友回復:
windows上執行緒物件的Handle就是句柄uj5u.com熱心網友回復:
SOCK阻塞的事情,同問。 我知道JAVA的,同樣的問題,執行緒組賽后無法中斷,后來改為Netty了事。delphi有沒有類似的框架?uj5u.com熱心網友回復:
百度了一下,好像也有非阻塞模式uj5u.com熱心網友回復:
常用的就是while中判斷Terminated屬性uj5u.com熱心網友回復:
在主執行緒單元中設定一個bStop:Boolean;初始化為False;在執行緒回圈中能訪問bStop,if bStop then break;就跳出回圈了,Execute可以結束了。。。。。一般用這種方式結束執行緒比較好吧,“自然”結束,當然你也可以暴力結束,主執行緒中設定一個變數th1:Thread1,這個變數在建立執行緒的時候用來記錄執行緒資料,需要暴力結束的時候,直接用th1.Terminateuj5u.com熱心網友回復:
X,都說阻塞了還回圈標志位,它會停在那里一直到有資料進來uj5u.com熱心網友回復:
我習慣這么弄
TTestThread = class(TThread)
private
FlagEnd: Boolean;
public
procedure Execute; override;
procedure FreeSelf;
end;
procedure TTestThread.Execute;
begin
inherited;
while not FlagEnd and not Terminated do
begin
//TODO:
end;
end;
procedure TTestThread.FreeSelf;
begin
FlagEnd := True;
Self.Free;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42779.html
標籤:語言基礎/算法/系統設計
