2017-10-15 66 views
-1

我正在使用此過程來執行Comandline。我在網上找到了這段代碼,除了一些細節外,它工作正常。我在一些論壇上看過不要使用ProcessMessages並將其放入一個線程中。在Delphi中沒有響應,請避免ProcessMessages並使用線程

當我刪除了Application.ProcessMessages線,那麼它停止工作。 然後,如果我保留它,而它正在執行,我得到"Not responding"。你能幫我在這種情況下使用線程嗎?

procedure ExecAndWait(const CommandLine: string); 
var 
    StartupInfo: TStartupInfo; 
    ProcessInfo: TProcessInformation; 
begin 
    FillChar(StartupInfo, SizeOf(StartupInfo), 0); 
    StartupInfo.cb := SizeOf(TStartupInfo); 
    StartupInfo.wShowWindow := SW_HIDE; 
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW; 

    //UniqueString(CommandLine); 

    if CreateProcess(nil, PChar(CommandLine), nil, nil, False, 
    0, nil, nil, StartupInfo, ProcessInfo) then 
    begin 
    while WaitForSingleObject(ProcessInfo.hProcess, 10) > 0 do 
    Application.ProcessMessages; 
    CloseHandle(ProcessInfo.hProcess); 
    CloseHandle(ProcessInfo.hThread); 
    end 
    else 
    RaiseLastOSError; 
end; 
end. 

procedure BuildThread; 
var 
    myThread: TThread; 

begin 
    // Create an anonymous thread that calls a method and passes in 
    // the fetchURL to that method. 
    myThread := TThread.CreateAnonymousThread(
    procedure 
    begin 
     ExecAndWait(); 
    end); 
end; 

我加了這一點:

procedure RunThread(const CommandLine: string); 
var 
    myThread: TThread;   
begin 
    myThread := TThread.CreateAnonymousThread(
    procedure 
    begin 
     ExecAndWait(CommandLine); 
    end). Start; 
end; 
+0

你的問題是什麼? –

+0

@DavidHeffernan,基本上我想知道如何防止「不響應」顯示。我在線閱讀,他們建議將CreateProcess放入線程 –

+0

創建一個線程以等待進程句柄。當它被髮信號時,通知UI線程。 –

回答

0

匿名線程並不意味着被引用。你不應該試圖保留引用你的線程的局部變量。相反,你應該直接從一個線程中調用在線與調用CreateAnonymousThreadStart ...

procedure RunThread(const CommandLine: string);  
begin 
    TThread.CreateAnonymousThread(
    procedure 
    begin 
     ExecAndWait(CommandLine); 
    end).Start; 
end; 

此外,你應該使用Application.ProcessMessages特別Application是VCL的一部分,它不是線程安全的,因此打破了VCL多線程安全規則。即使不是這樣,它仍然是無用的,因爲它只用於主UI線程。

相關問題