如何定义timeSetEvent作为实例方法的回调函数?
TUDPBC = class(TObject)
private
hTimer: word;
...
public
procedure sendUDPBC;
...
end;
procedure DoTimer(uTimerID, uMessage: UINT; dwUser,dw1,dw2: DWORD); stdcall;
procedure TUDPBC.sendUDPBC; //send UDP Broadcast
begin
...
hTimer := TimeSetEvent(FTimeOut, uRes, DoTimer, 0, TIME_ONESHOT); //need DoTimer as a TUDPBC class method
...
end;
Run Code Online (Sandbox Code Playgroud) 当我通过将终止标志设置为true来停止线程'srch_slave_thread'时,(srch_slave_thread.terminate)释放线程在析构函数的'inherited'行停止,为什么?是挂起的WaitFor吗?如果我在析构函数中注释掉'inherited',那么线程就会停止并释放自己.
取出'继承'并调出代码后:为什么线程在调用析构函数后会跳转到DoTerminate方法?
谢谢.
Tsrch_slave_thread = class(TThread)
private
FSW: TStopWatch;
protected
procedure Execute; override;
public
SimpleEvent: TSimpleEvent;
procedure DoTerminate; override;
...
constructor Create;
destructor Destroy; override;
end;
Run Code Online (Sandbox Code Playgroud)
创建事件obj.在构造函数中>>
constructor Tsrch_slave_thread.create;
begin
inherited create(true);
Fsw := TStopWatch.Create;
SimpleEvent := TSimpleEvent.Create;
end;
Run Code Online (Sandbox Code Playgroud)
调用析构函数后跳转到这里?>>
procedure Tsrch_slave_thread.DoTerminate;
begin
inherited;
self.simpleEvent.SetEvent;
end;
Run Code Online (Sandbox Code Playgroud)
线程在析构函数>>中继承
destructor Tsrch_slave_thread.destroy;
begin
self.SimpleEvent.free;
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
在这里创建线程>>
function TMaster.th_slvsearch_start: integer;
begin
if not Assigned( Fslave_search_thread ) then begin
Fslave_search_thread := TFslave_search_thread.create;
...
end
else begin
...
exit;
end;
with Fslave_search_thread do
begin
master …Run Code Online (Sandbox Code Playgroud) 如果只点击一个空白区域,如何决定TreeView的OnClick事件?我使用下面的代码,但在CheckNode中,我总是得到一个TreeNode实例,尽管我只点击了TreeNode旁边的空白区域.
procedure TfrmDevTree.TreeView1Click(Sender: TObject);
var
p: TPoint;
CheckNode: TTreeNode;
begin
GetCursorpos(p);
p := TreeView1.screentoclient(p);
CheckNode := TreeView1.GetNodeAt( p.X, p.Y );
if CheckNode = nil then
Exit;
...
end;
Run Code Online (Sandbox Code Playgroud)