2014-03-24 50 views
0

我試圖通過cmd.exe中的批處理文件在我的Qt應用程序中打開服務器。儘管我使用QProcess :: startDetached()來啓動命令行,但它在啓動後立即關閉。服務器正在啓動,但不是「提供服務」,該進程被終止。這裏是我的代碼:命令行關閉儘管使用QProcess :: startDetached()

void DICOMReceiver::startReceiver() 
{ 
    QProcess receiver; 
    boost::filesystem::path dbDir = boost::filesystem::absolute(databaseDirectory.toStdString()); 
    receiver.startDetached("cmd.exe", QStringList() << "/c" << 
          "dcmrcv.bat" << "AETitle:11112" << "-dest " << dbDir.string().c_str()); 
    receiver.waitForStarted(); 
} 

當我在cmd.exe中手動運行該批處理文件時,它按照需要工作。 有沒有人有一個想法如何保持進程運行,以便我可以使用服務器?

回答

1
  1. startDetached是一個靜態函數。你不需要一個流程實例。

  2. 你應該通過一個工作目錄到startDetached。對於所有我知道它「關閉」,因爲該批處理文件不存在它正在尋找它。

  3. 由於startDetached方法不知道關於您的receiver實例的任何信息,因此您的waitForStarted()呼叫是無操作的。你只是寫了迷惑你的C++。在使用Qt時,無法等待分離的進程啓動。一個獨立的過程是不容忽視的。

  4. 請勿使用waitForXxx方法,因爲它們會阻塞它們所在的線程,並使UI無響應。改用信號插槽連接並編寫異步代碼。

所以,你的方法應該是固定的,如下所示:

void DICOMReceiver::startReceiver() 
{ 
    boost::filesystem::path dbDir = 
    boost::filesystem::absolute(databaseDirectory.toStdString()); 
    // FIXME 
    const QString batchPath = QStringLiteral("/path/to/the/batch/file"); 
    QProcess::startDetached("cmd.exe", QStringList() << "/c" 
          << "dcmrcv.bat" << "AETitle:11112" << "-dest " 
          <<< dbDir.string().c_str(), batchPath); 
} 
+0

謝謝你的答案,但它仍然是啓動後立即關閉。我看到服務器的輸出在屏幕上衝過來,然後消失。我試圖在沒有其他論據的情況下啓動它,但這也不是問題。當我啓動cmd.exe時,它可以工作(即使使用我的第一個版本)。 –

+0

然後問題不在於你的代碼,而是批處理文件提前退出。用一個只顯示其參數的虛擬批處理文件替代,並在結尾執行「暫停」。它會工作。然後慢慢開始從'dcmrcv.bat'向它添加東西。它確實在調試101,而且在這一點上與Qt或C++無關。 –

+0

對我來說似乎不合邏輯,因爲當我在cmd.exe中手動調用該批處理文件時,該批處理文件未關閉,並且在創建指向該文件的鏈接時給予它所需的參數,並且只需運行該鏈接即可。它只是在使用QProcess時關閉。但我會試一試。 –

相關問題