线程中的“WaitForSingleObject”不是阻塞式的?(100分)

  • 主题发起人 liuchong
  • 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
本意是想在线程中监测用CreateProcess启动的进程,在子进程退出时,自动结束自身进程。
但在主线程中使用“WaitForSingleObject”是阻塞的,这会影响发送键盘模拟
可是在子线程中“WaitForSingleObject”却反复执行,并不阻塞,代码如下:
TCheckProcess=class(TTHread)
private
I:Cardinal;
ProcessInfo:TProcessInformation;
procedure SetCaption;
protected
procedure Execute;override;
public
constructor Create(ProcessInfo:TProcessInformation);
end;

{ TCheckProcess }
constructor TCheckProcess.Create(ProcessInfo: TProcessInformation);
begin
inherited Create(False);
ProcessInfo:=ProcessInfo;
end;

procedure TCheckProcess.Execute;
begin
FreeOnTerminate:=True;
while Truedo
begin
//这里本应是阻塞的
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
Synchronize(SetCaption);
end;
end;

procedure TCheckProcess.SetCaption;
begin
Inc(I);
Form1.Caption:=IntToStr(I);
end;


主线程调用:
procedure TForm1.FormCreate(Sender: TObject);
var
StartupInfo:TStartUpInfo;
ProcessInfo:TProcessInformation;
MyThread:TCheckProcess;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),0);
with StartupInfodo
begin
cb:=SizeOf(StartupInfo);
dwFlags:=StartF_UsesTDHandles or STARTF_USESHOWWINDOW;
lpTitle:=nil;
wShowWindow:=SW_Show;
end;
CreateProcess('a.exe',nil,nil,nil,true,DETACHED_PROCESS,nil,nil,StartupInfo,ProcessInfo);
MyThread:=TCheckProcess.Create(ProcessInfo);
//下面是模拟键盘代码
//...................
end;
 
我初步看了一下你的代码,可能是这里的问题:
constructor TCheckProcess.Create(ProcessInfo: TProcessInformation);
begin
inherited Create(False);
ProcessInfo:=ProcessInfo;//!!!两个变量名称相同。应该是参数优先
end;

提出几个问题,希望你无则加勉,有则改之
第一,变量命名不规范,字段命名建议FProcessInfo
第二,你应该调试一下,WaitForSingleObject(你等待的是0
第三,WaitForSingleObject立即返回了,你为何不检测一下返回的结果,以及GetLastError
这些基本的技巧需要学会!
 
确实是重名
 

Similar threads

顶部