2015-09-30 58 views
1

在這種thread我解決了我的情況,並感謝一部分到NathanOliver我有下面的代碼至今:在我的C++控制檯應用程序的具體流程Unsuccesfull管理

int main(){ 
    //... 
    bool proc1 = false, proc2 = false, proc3 = false, proc4 = false, 
    while(true) { 
     if(!proc1 && ProcessRunning("process1.exe")){ 
      fun1("fun1.bat"); 
      proc1 = true; 
     } 
     if(!proc2 && ProcessRunning("process2.exe")){ 
      fun1("fun2.bat"); 
      proc2 = true; 
     } 
     if(!proc3 && ProcessRunning("process3.exe")){ 
      fun1("fun3.bat"); 
      proc3 = true; 
     } 
     if(!proc4 && ProcessRunning("process4.exe")){ 
      fun1("fun4.bat"); 
      proc4 = true; 
     } 
    } 
    return 0; 
} 

我仍然可以」 t通過的情況是:

  • 雙擊app1 - >process1開始。
  • process1運行我雙擊APP2使process2應該有相同的行爲,我在我的第一個線程中提到:

如果發現process2(第二if(){}),它創建的。 bat文件和 它執行它(殺死process2(它可能在我打開它之前就已經存在),再次啓動它,刪除由fun2(const char name[]){}生成的.bat文件。


總結以前的帖子:

int fun1(const char name[]){ 
    ofstream file; 
    file.open(name, ios::out); 
    //start of what I write in .bat 
    file << "@echo off";  
    file << "cd to specific path"; 
    file << "taskkill /im process.exe* /f"; 
    file << "start process.exe"; 
    file << "del \"%~f0\""; 

    file.close(); 
    return system(name); 
} 

完全一樣的,其餘的功能。

+0

在所有四種情況下,您是否打電話給'fun1'出現錯字? – molbdnilo

+0

這不會起作用,因爲proc1被設置爲false,並保持這種狀態,我可以在代碼中看到。 –

+0

@molbdnilo不,每個函數都有自己的名字。例如:'function1',...,'function4',並且在我的'main()'中正確調用它們中的每一個。我知道這些標誌可能是一個問題,但我只能使用它們到目前爲止 –

回答

1

我相信你運行.bat文件作爲同步程序,因此,直到蝙蝠不會完成並返回退出代碼(你可以檢查爲系統函數的返回值),你的主程序將不會繼續運行。您可以在基於Linux的系統上使用fork來使用異步進程,而在Windows OS上使用CreateProcess。

0

這個怎麼樣? (C++ 11標準)

bool proc[] = {false, false, false, false}; 

    while(true) 
    { 
     for(int i=0 ; i<4 ; i++) 
     { 
     const std::string exeName = "process" + std::to_string(i) + ".exe";    
     const std::string funName = "fun" + std::to_string(i) + ".bat";    

     if(!proc[i] && ProcessRunning(exeName.c_str())) 
     { 
      fun1(funName.c_str()); 
      proc[i] = true; 
     } 
    } 

應該讓事情變得更靈活一些,但要解決您的問題。如果條件比較第一個表達式proc然後ProcessRunning(...)。爲了進入控制塊,兩者都必須是真實的。

但是你的文件解釋fun1()似乎有一個問題,至少在評論中。您提到例如//taskkill process.exe但它必須是process#

如果您提供完整的fun1實施方案或至少最相關的零件,我可以幫助您進一步瞭解。儘管你的週期應該起作用。問題必須在fun1(...)

P.D .:我也會將fun1(...)重命名爲更有意義的東西。

+0

我修改了'fun1'函數,以便它現在對您更有意義。你有一些誤解:每個函數都有不同的名稱(我使用fun1作爲模型)。每個函數創建'.bat'的相同結構,但每個'.bat'處理的過程都不相同。 –

+0

但是在批處理文件中,您指的是''process.exe''你試圖殺死的東西。所以如果你要求''process1.exe''。它不會被發現。嘗試使用正確的進程名稱創建該批處理文件。此外,爲什麼每次執行應用程序時都要重寫批處理文件?你想用你的程序做什麼?我認爲我們需要一些解釋。它似乎似乎有一個更好的更優雅的方式來完成你的任務。 –

相關問題