问题1:关于线程的创建
我使用的创建方法是:
Thread1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
然后在Thread1.Execute中写实现过程,直接使用Thread1.create创建
那么这样创建的话我能获取创建线程的句柄吗?如果我想要强制关闭此线程该怎么办??问题2:线程强制终止会有什么影响??问题3:terminatethread和terminate函数怎样终止线程??假如线程在while循环中,能终止吗?总共3个问题,一个50分,希望各位大神帮我解惑,谢谢了
我使用的创建方法是:
Thread1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
然后在Thread1.Execute中写实现过程,直接使用Thread1.create创建
那么这样创建的话我能获取创建线程的句柄吗?如果我想要强制关闭此线程该怎么办??问题2:线程强制终止会有什么影响??问题3:terminatethread和terminate函数怎样终止线程??假如线程在while循环中,能终止吗?总共3个问题,一个50分,希望各位大神帮我解惑,谢谢了
解决方案 »
- DELPHI7 调用外部dll问题?
- 求个智能进货的思想!!!毕业设计!!!!急!!!!100分
- 怎样将TMemoryStream中的内容放到一个StringList中
- cxDbImage控件的问题
- 在播放音乐时显示其波形,应该如何实现
- web服务服务器端设置
- DLL中如何加载其他DLL
- 我的quickrep在针式打印机上正常打印,但在激光机上却没任何反应?
- 如何判断stringgrid中的某一行被修改了.并获得该行的数据
- 如何监听局域网上的IP数据报?来自:http://vr_fight.home.chinaren.com
- Delphi Android 环境配置
- delphi代码转为c#代码,求协助
TTdownLoadThread = 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;
...
unit LongWaitTrd;interfaceuses 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;implementationuses 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.
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;