Prozess Überprüfungsschleife
-
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.
-
Für sowas solltest du wirklich die Win API benutzen. Guck dir dazu mal
CreateProcessundWaitForSingleObjectan. Das ist genau das, mit dem du dein Problem elegant lösen kannst.Unvollständiger Pseudocode:
int main() { STARTUPINFO si; PROCESS_INFORMATION pi; if( CreateProcess( ..., &si, &pi ) ) { ::WaitForSingleObject( pi.hProcess ); ::CloseHandle( pi.hProcess ); ::CloseHandle( pi.hThread ); } }Edit:
Dein Programm funktioniert nicht richtig, wenn gleichzeitig noch irgendein anderes Java Programm ausgeführt wird.
-
Ja, das kann ich auch ohne WinAPI glaub ich nich anders machen. Wenn ich nebenbei noch mit JDownloader was runterlade, beenden sich das Programm nicht

Ich werds mal mit WinAPI probieren. Mal sehn ob ich da zu was komme. Hab das noch nie gemacht.
EDIT: So, da jetzt (14.06) Wochenende ist fang ich mal an zu programmieren

Ich hab mir das jetzt so überlegt, dass ich den Launcher nicht mehr explizit für Minecraft mache, sondern generell für alle ausführbaren Programme. Deshalb wollte ich bei Programmstart das so machen, dass der Programmpfad abgefragt wird und dazu dann in %appdata% in einem Unterordner eine Datei angelegt wird, in welcher der Pfad gespeichert ist. Diese Datei soll dann automatisch bei jedem Programmstart geladen werden und dann Programm gestartet werden.
Aber dass man das Konsolenfenster minimiert oder dass es nur in der Taskleiste angezeigt wird geht nich mit C++, oder?
EDIT2: Ok, geht, grad mal gegoogled
-
So, hab jetzt schonmal so ein bischen den Anfang, leider läuft das Programm nicht so wie ich es mir vorgestellt hab.
Hier der Code:
// Program Launcher.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include <stdafx.h> #include <conio.h> #include <iostream> #include <windows.h> #include <string> char korrekt = 'n'; using namespace std; int main() { SetConsoleTitle(_T("Program Launcher")); string path; while (korrekt == 'N' || korrekt == 'n') { cout<<"Bitte geben Sie den Pfad zu Ihrem Programm ein:"<<endl; cout<<"Programmpfad: "; getline(cin, path); cout<<endl<<endl<<"Ist dieser Pfad korrekt?: "<<path<<endl; cout<<"Korrekt? (Antwort mit j oder n): "; cin>>korrekt; if (korrekt != 'N' || korrekt != 'n' || korrekt != 'J' || korrekt != 'j') { cout<<"Bitte antworten Sie nur mit j oder n!"<<endl; korrekt = 'n'; } } _getch(); return 0; }Nur leider erhalte ich folgendes Ergebnis:
https://dl.dropboxusercontent.com/u/11268312/Program%20Launcher%20Probleme....PNG
Das mit dem Bild einfügen hat irgendwie nicht funktioniertWie ihr seht zeigt es den Text in der if Klammer trotz nich eingetretener Bedingung an. Das versteh ich halt nicht dadran. Habt ihr dazu einen Tipp oder wisst wo der Fehler ist?
und Tschuldigung an die Mods / Admins für den Doppelpost, aber sonst hätte ja keiner gesehn, dass ich den alten Beitrag bearbeitet hätte...
-
Du willst und statt oder.
Es müssen ja alle vier Bedingungen erfüllt sein, nicht nur eine.
-
Ah ok! Danke!!
Ok, das funktioniert jetzt schonmal. Aber wenn ich jetzt da n für Nein eingebe, dann überspringt der die erneute Abfrage nach dem Programmpfad einfach.
Ich denke, es liegt daran, dass er schon einen Wert für den String hat. Kann man einen String irgendwie clearen?
Ich habe schon probiert einen neuen String zu definieren und habe dann direkt an den Anfang der Schleife
path = pathclear; //pathclear ist der neue stringzu schreiben aber das bringt auch nichts, habt ihr da eine Lösung?
-
Probier mal:
std::cin.sync(); std::cin.clear();am Schleifenende.
-
jkljkljkl schrieb:
Probier mal:
C++:
std::cin.sync();
std::cin.clear();am Schleifenende.
Danke!!! Funktioniert 1A

Habs schonmal mit cin.clear(); alleine probiert, das hat aber nicht funktioniert.
cin.sync kannte ich noch nicht. Danke
-
Weiß jemand, wie ich einen Ordner in %appdata% erstelle?
Ich habs mit
_mkdir("%appdata%\\Program Launcher");probiert, aber das funktioniert nicht.
Habe dann mal gegooglet und bin auf ner Microsoft Seite und einer Seite des Forums gelandet, werde daraus aber auch nicht schlauer....
http://www.c-plusplus.net/forum/102386-full
http://social.msdn.microsoft.com/Forums/en-US/visualcsharpde/thread/9e517047-6c34-4be5-a6cc-9fbe913497f3