【问题标题】:Execute background program and continue execution of code?执行后台程序并继续执行代码?
【发布时间】:2014-08-08 21:48:44
【问题描述】:

我想从我的 Delphi 代码中运行一个后台应用程序。打开的应用程序是一个基于 DOS 的 EXE,它将内容输出到 DOS 窗口。该程序将无限期打开,直到从任务管理器中关闭。我用来打开应用程序的当前代码是;

procedure CaptureConsoleOutput(const ACommand, AParameters: String; CallBack: TArg<PAnsiChar>);
const
    CReadBuffer = 2400;
var
    saSecurity: TSecurityAttributes;
    hRead: THandle;
    hWrite: THandle;
    suiStartup: TStartupInfo;
    piProcess: TProcessInformation;
    pBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dBuffer: array [0 .. CReadBuffer] of AnsiChar;
    dRead: DWord;
    dRunning: DWord;
begin
    saSecurity.nLength := SizeOf(TSecurityAttributes);
    saSecurity.bInheritHandle := True;
    saSecurity.lpSecurityDescriptor := nil;

    if CreatePipe(hRead, hWrite, @saSecurity, 0) then
    begin
        FillChar(suiStartup, SizeOf(TStartupInfo), #0);
        suiStartup.cb := SizeOf(TStartupInfo);
        suiStartup.hStdInput := hRead;
        suiStartup.hStdOutput := hWrite;
        suiStartup.hStdError := hWrite;
        suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        suiStartup.wShowWindow := SW_HIDE;

        if CreateProcess(nil, pChar(ACommand + ' ' + AParameters), @saSecurity, @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then
        begin
            repeat
                dRunning := WaitForSingleObject(piProcess.hProcess, 100);
                //Application.ProcessMessages();
                repeat
                    dRead := 0;
                    ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                    if(dRead > 0) then
                    begin
                      pBuffer[dRead] := #0;
                      //ShowMessage(pBuffer);
                      //OemToAnsi(pBuffer, pBuffer);
                      //Unicode support by Lars Fosdal
                      OemToCharA(pBuffer, dBuffer);
                      CallBack(dBuffer);
                    end;
                until (dRead < CReadBuffer);
            until (dRunning <> WAIT_TIMEOUT);
            CloseHandle(piProcess.hProcess);
            CloseHandle(piProcess.hThread);
        end;
        CloseHandle(hRead);
        CloseHandle(hWrite);
    end;
end;

这很好,但是因为程序不会“退出”并且永远保持打开状态,我的应用程序会挂起,并且代码永远不会移动。

任何帮助将不胜感激

【问题讨论】:

  • 这里没有DOS。正确的术语是控制台应用程序

标签: delphi


【解决方案1】:

如果您不需要对生成的进程执行任何操作,您只需关闭CreateProcess() 返回的句柄并继续前进,该进程将继续运行。但是由于您似乎需要从生成的进程的输出中连续读取,您可以简单地将逻辑移到工作线程中,这样您的主代码就不会再被阻塞了。

【讨论】:

    【解决方案2】:

    //你必须把你的 conde 放在一个线程中。例如:

    //假设您要 ping Google 服务器。您必须在 Delphi 的界面部分中创建一个类似于 //below 的线程。您将通过选择 File-New-//Other-Thread Object 来完成此操作,然后根据需要命名您的线程。

    类型 TPing = 类(TThread) 私人的 { 私有声明 } 受保护 程序执行;覆盖; 结束;

    //将您的 CaptureConsoleOutput 过程复制到 Thread 单元。

    //在执行过程中,调用你的 CaptureConsoleOutput 过程。 //在我的例子中,我只是直接在备忘录组件中捕获输出。

    //这对我来说效果很好!

    过程 TPing.Execute; 开始 优先级:= tpLower; CaptureConsoleOutput('ping www.yahoo.com', '-t', Form1.Memo2); 结束;

    【讨论】:

      猜你喜欢
      • 2019-03-11
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      相关资源
      最近更新 更多