私は値を取得してTMemoを送る文字列に設定する方法がわからないので、常に私に値を返すcmdを持っています。 CMDの結果を得るためにスレッド - DOS出力を同期させよう
コード:
function GetDosOutput(CMD: string; Dir: string = 'C:\'): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
Handle, WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
utf8: UTF8String;
begin
Result := '';
SA.nLength := SizeOf(SA);
SA.bInheritHandle := True;
SA.lpSecurityDescriptor := nil;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
SI.wShowWindow := SW_HIDE;
SI.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
SI.hStdOutput := StdOutPipeWrite;
SI.hStdError := StdOutPipeWrite;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CMD), nil, nil, True,
0, nil, pchar(Dir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then begin
Buffer[BytesRead] := #0;
utf8:= Result + String(Buffer);
Result:= utf8;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;
を結果が更新されて停止しないよう、スレッドが終了しませんので、私はちょうどで更新する必要があり、スレッドが終了するまで待つことができませんランタイム。
シンクロナイゼーションを使用しようとしましたが動作しませんでした。どうすればいいですか?
マイコード:
type
TThread_DOS = class(TThread)
private
FCmd: string;
FResult: string;
protected
procedure Execute; override;
public
Constructor Create(const cmd: string; Notify: TNotifyEvent);
property Result: string read FResult;
property CMD: string read FCmd;
end;
constructor TThread_DOS.Create(const cmd: string; Notify: TNotifyEvent);
begin
inherited Create(false);
FCmd:= cmd;
FreeOnTerminate:= true;
OnTerminate:= Notify;
end;
procedure TThread_DOS.Execute;
begin
inherited;
FResult:= (GetDosOutput(FCmd));
end;
Repeat ... UntilループにResult値を表示しますか?またはループの1回後?あなたのコードは常に(ノンストップ)結果ではありません –
@M ... Mはリアルタイムで結果を得る必要があります。スレッドのOnTerminateイベントを使用することはできません。 – strykerbits
イベントをOnTerminateする必要はなく、私の回答に投稿したユニットを使用してください –