2016-05-18 7 views
2

Ich versuche, ein Konsolenfenster zu erstellen, um eine andere ausführbare Datei aus meiner Anwendung basierend auf einigen vom Benutzer ausgewählten Daten auszuführen. Es ist eine ziemlich einfache Einrichtung gerade jetzt.Spawn Konsolenfenster ohne sperrende Anwendung

std::string command; 
{ 
    command += "\"" + INSTALL_DIR + "export.exe\""; 
    command += " -id " + processID; 
} 
system(command.c_str()); 

Das Problem ist der Export zu einer Stunde dauern könnte oder mehr und ich will nicht um die Anwendung zu sperren. Ich habe erwähnt, dass die Verwendung von "&" am Ende Ihres Befehls dies erreichen würde (wie: "c: \ some \ path \ export.exe -id 19998 &"), aber es funktioniert nicht für mich.

Jede Hilfe wäre willkommen.

+0

Hinzufügen & funktioniert nur auf * nix systems. – gview

+0

und nicht einmal im Systemkommando interpretiert bash &. –

+0

Ich würde [CreateProcess] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx) verwenden –

Antwort

5

Das Problem ist, dass der Export bis zu einer Stunde oder mehr dauern kann und ich möchte die Anwendung nicht sperren.

system() Aufrufe werden synchron ausgeführt und blockieren den aufrufenden Thread bis zum Ende.

Suchen Sie nach CreateProcess() mit dem winapi direkt zu interagieren, oder verwenden Sie fork() und eine Funktion aus der exec() Familie Laich ein asynchron laufenden Kindprozess.


Weitere (portable) Lösung ist eine separate std::thread in Ihrer Anwendung zu verwenden, die die system() Aufruf ausgibt:

std::string command; 
command += "\"" + INSTALL_DIR + "export.exe\""; 
command += " -id " + processID; 

std::thread t([](const std::string& command){ 
     system(command.c_str()); 
    }, command); 
std::cout << "main thread" << std::endl; 

Aber Sie müssen zumindest für diesen Thread, bevor Sie Ihre Anwendung beendet beitreten:

t.join(); 
0

& funktioniert innerhalb der Shell (Eingabeaufforderung). Was Sie tun sollten, ist ein neuer Thread mit CreateThread oder wenn Sie C++ 11 std::thread verwenden, und rufen Sie den neuen Befehl von dort. Ich würde jedoch empfehlen, den Systembefehl nicht zu verwenden: http://www.cplusplus.com/forum/articles/11153/