2012-12-12 58 views
0

我正在嘗試執行以下操作: 我有一個帶有網格的窗口,並且在每個單元中我想顯示遠程計算機(使用VNC)。爲此,我啓動流程並將其放入面板中。在任務中等待進程

我的問題是,我不得不等待該進程是一個特定的窗口(因爲認證窗口顯示在我想要的真正的窗口之前很短的時間)。

因此,對於每一個過程,我要開始我這樣做:

Task t = Task.Factory.StartNew(() => 
{ 
    Process proc = Process.Start(@"C:\Program Files\RealVNC\VNC4\vncviewer.exe", name + " -Scaling AspectFit -Enabletoolbar=0"); 
    Thread.Sleep(4000); // Wait for real window 
    this.BeginInvoke((MethodInvoker)delegate 
    { 
     AddProcessToTable(proc, name); // Adds the window in the panel 
    }); 
}); 

並能正常工作;但如果我想更換Thread.Sleep()這一點:

while (!proc.MainWindowTitle.Contains(name)) 
    Thread.Sleep(10); 

但是當我這樣做,我的啓動進程,但他們沒有在面板中去。我把斷點檢查,並在這段時間和之後的行被執行,所以我不知道哪裏可能出錯... 這一定是可能的,因爲this guy做到了。

僅供參考,這裏是功能附加進程到TableLayoutPanel中:

void AddProcessToTable(Process proc, string name) 
{ 
    Control panel = null; 
    // ... 
    // Retrieving panel 
    // ... 

    SetParent(proc.MainWindowHandle, panel.Handle); 
    SendMessage(proc.MainWindowHandle, 274, 61488, 0); 
} 
+0

我不知道,如果連接跨越進程和線程窗口層次是一個好主意。 – usr

+0

是的,我還在想混合winapi和任務聽起來很麻煩,但它在工作時(通過Thread.Sleep)大大加快了整體處理速度。我只想讓它對Thread.Sleep更少依賴,我不知道爲什麼我的兩個解決方案之間存在行爲差異 –

回答

0

代替了Thread.Sleep,爲什麼不使用proc.WaitForInputIdle(),它會等待過程進入主要窗口的消息循環並準備好輸入。還有的文檔在http://msdn.microsoft.com/en-us/library/8d7363e2.aspx,我發現(但沒有測試)關於如何使用它的文章在http://www.akadia.com/services/dotnet_process_handling.html

Process process = new Process(); 
    process.StartInfo.FileName = "Notepad"; 
    process.Start(); 

    process.WaitForInputIdle(); 

    Thread.Sleep(5000); 
    if(!process.CloseMainWindow()) 
    { 
     process.Kill(); 
    } 
+0

我不認爲等待輸入是正確的,因爲第一個窗口I試圖避免捕獲確實有輸入,登錄和密碼。但我仍然嘗試過並且遇到同樣的問題,我的流程已啓動,但未放入面板中。 –