Prozess Überprüfungsschleife
-
Hi Leute,
ich wollte fragen ob es eine Schleife gibt für eine C++ Konsolenanwendung, die die ganze Zeit überprüft ob ein bestimmter Prozess läuft. Erst wenn der Prozess nicht mehr läuft, soll das Programm fortfahren.
Ich habe dazu auch schon viel gegooglet, habe aber leider nie was passendes gefunden, was bei mir auch funktionierte.Außerdem wollte ich fragen, ob man irgendwie auch im Programm einbauen kann, dass sich die Konsole minimiert.
Ich hoffe, dass ich mir da weiterhelfen könnt.
Danke schonmal im voraus.LG
jkhsjdhjs
-
Nein, C++ kennt weder Prozesse noch Fenster. Das ist Sache des Host-Systems. Wenn du Windows benutzt, frag im WinAPI Forum noch mal. Tipp: Google das was du willst auf Englisch + WinAPI, da wirst du fündig. z.B. "winapi wait for process termination"
-
Sowas ist in C++ selber nicht möglich. Dafür muss man die Betriebssystemfunktionen verwenden. Für Windows wäre das die WinAPI. Falls du aber erst gerade angefangen hast zu programmieren, solltest du zunächst die Grundlagen lernen. Alles andere wird kein gutes Ende nehmen.
-
Achso, schade. Naja ok, danke für eure schnellen Antworten

-
Das heißt, mir ist gerade eine Idee gekommen, wie du das ganze a) umsetzen kannst und b) noch etwas dabei lernst.
Es ist zwar kein guter Stil, aber du kannst mit der Funktion
systemBefehle ausführen, als wären sie in der Konsole manuell eingegeben worden.Wenn du also
system("tasklist > prozesse.txt")in dein Programm einbaust, dann wird eine Datei prozesse.txt erzeugt, wo alle aktuell laufenden Prozesse drin stehen. Diese datei könntest du dann mit C++ öffnen und schauen, ob der Prozess darin enthalten ist.Wie gesagt, normalerweise würde man das mit der WinAPI lösen, aber als Notlösung und kleine Übung, scheint mir das ganz gut geeignet zu sein.

-
Cool, danke!!
Wie lese ich denn eine txt Datei in C++ ein? Ich lern das erst seit nem halben Jahr und kann noch nicht so viel...
-
#include <fstream> // ... std::ifstream in("prozesse.txt"); std::string line; while (std::getline(in, line)) { std::cout << line << std::endl; }Am besten kaufst du dir ein gutes Buch. Empfehlungen findest du dazu hier im Forum.
-
Ok! Vielen Dank für deine Hilfe!

-
Du machst das seit 6 Monaten und kannst keine Textdatei einlesen? Macht man das nicht so.. am 3. Tag?^^
-
Nee. Ich lern das in der Schule, bin in der elften und hab Informatik nur einmal in der Woche 1:30h.
-
jkhsjdhjs schrieb:
Nee. Ich lern das in der Schule, bin in der elften und hab Informatik nur einmal in der Woche 1:30h.
Falls dir das Thema wirklich Spaß macht und dich interessiert, kauf dir ein gutes Buch und lern zuhause richtig zu programmieren. Das was da in der Schule gemacht wird, ist meistens veraltet oder einfach nur falsch...
-
Korrigiere: Macht man das nicht so.. in der 3. Woche? Wie auch immer, der system() Kram ist der denkbar schlechteste Weg. Es funktioniert genau so nur auf Windows, ist aber total instabil und langsam. Google es einfach. Das ist wirklich nicht besonders schwer.
-
Also ich hab jetzt folgendes geschrieben und es funktioniert aus irgendeinem Grund nicht. Ich wette, ihr findet direkt tausende von Fehlern...

// Minecraft.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <conio.h> #include <iostream> #include <windows.h> #include <fstream> #include <string> #include <string.h> #include <stdlib.h> int a; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout<<"Minecraft wird gestartet..."<<endl; system("C:\\Progra~2\\Minecraft\\Minecraft.exe"); while(a==0) { Sleep(1000); system("tasklist > C:\\temp\\prozesse.txt"); ifstream h; string s; h.open("C:\\temp\\prozesse.txt", ios::in); bool abbrechen = false; while (!h.eof() && !abbrechen) // Bis nix mehr zum lesen gibt ... ausführen { getline(h, s); // Das liest jede zeile ... if(s == "javaw.exe") abbrechen = true; if(abbrechen) cout << s << endl;// Das gelesene wird ausgegeben } h.close(); cin.get(); if (s!="javaw.exe") { a=1; } } return 0; }Also, das Programm soll Minecraft starten, dann nach 10 Sekunden die Prozessliste in eine txt Datei schreiben. In dieser wird dann nach javaw.exe gesucht, bist javaw gefunden wurde. Dann soll die große Schleife nur verlassen werden, wenn s!="javaw.exe" ist.
Nur wenn ich im Konsolenfenster Enter drücke, beendet sich das Programm so oder so. Es soll sich, wenn die javaw.exe nicht mehr gefunden wurde, selbst beenden.Und ja, ich weiß, dass der Weg ziemlich dämlich ist, aber ich will halt bei C++ bleiben. ^^
-
Das liegt daran, dass in der Zeile mehr als nur javaw.exe steht.
Schau einfach nach, ob es enthalten ist:
if (s.find("javaw.exe") != std::string::npos) { // ... }
-
Ah gut, Danke Danke!
Das Programm findet jetzt die Zeile und hat diese auch ausgegeben!
Nur läuft irgendwie immer noch nicht alles ganz rund. Wenn ich Minecraft beende, dann bleibt das Konsolenfenster noch geöffnet, obwohl es doch die Schleife verlassen soll wenn es kein javaw findet und dann ist ja nur noch return 0 da.
// Minecraft.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <conio.h> #include <iostream> #include <windows.h> #include <fstream> #include <string> #include <string.h> #include <stdlib.h> int a; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout<<"Minecraft wird gestartet..."<<endl; system("C:\\Progra~2\\Minecraft\\Minecraft.exe"); while(a==0) { Sleep(1000); system("tasklist > C:\\temp\\prozesse.txt"); ifstream h; string s; h.open("C:\\temp\\prozesse.txt", ios::in); bool abbrechen = false; while (!h.eof() && !abbrechen) // Bis nix mehr zum lesen gibt ... ausführen { getline(h, s); // Das liest jede zeile ... if (s.find("javaw.exe") != std::string::npos) { abbrechen = true; } else if (!(s.find("javaw.exe") !=std::string::npos)) { a=1; } } h.close(); cin.get(); } return 0; }Und wenn ich das cin.get(); (wofür ist das überhaupt gut?) weglasse, dann beendet sich das Fenster sofort...
Ich habe das Programm jetzt übrigens so geändert, dass es die Zeile nicht mehr ausgibt, da ich ja jetzt weiß, dass das funktioniert.
-
Wenn das Programm durch ist, schließt sich das Programm, da es ja fertig ist. Das cin.get() wartet auf eine Eingabe und somit schließt sich das Fenster nicht.
-
Also ist das cin.get(); eigentlich das gleiche wie _getch(); oder?
-
jkhsjdhjs schrieb:
Also ist das cin.get(); eigentlich das gleiche wie _getch(); oder?
Nein. Bei cin.get(); muss du die Eingabe mit einem Enter bestätigen. Bei _getch(); musst du das nicht.
Du solltest dir unbedingt angewöhnen, dass du solche simplen Sachen zunächst einfach selber ausprobierst oder dich in der Dokumentation einliest. Man muss nicht alles wissen, aber man sollte in der Lage sein es nachzulesen.
-
Ok, Danke

Werd ich machen.
-
So, habe jetzt endlich das Projekt doch noch fertig gestellt, jeztt kommts mir total einfach vor, wenn ichs so betrachte, is auch nich sonderlich lang.
Hab den Text Minecraft wird gestartet noch zentriert.// Minecraft Launcher for Steam.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include <stdafx.h> #include <conio.h> #include <iostream> #include <string> #include <iomanip> #include <windows.h> #include <fstream> #include <string.h> #include <stdlib.h> bool abbrechen=false; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string text="Minecraft wird gestartet..."; system("C:\\Progra~2\\Minecraft\\Minecraft.exe"); int max=80; max=(max-text.size())/2; cout<<setw(max)<<""<<text<<endl; punkt1: ifstream h; string s; system("tasklist > C:\\temp\\prozesse.txt"); h.open("C:\\temp\\prozesse.txt", ios::in); while (!(h.eof())) { getline(h, s); if (s.find("javaw.exe") !=std::string::npos) { h.close(); goto punkt1; } } h.close(); return 0; }Hatte lange Zeit keine Lust mehr aber habs heute doch nochmal angefangen.