Prozess Überprüfungsschleife



  • 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 CreateProcess und WaitForSingleObject an. 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 funktioniert

    Wie 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 string
    

    zu 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



  • Mit SHGetSpecialFolderPath() holste dir den Pfad und mit CreateDirectory() erstellst du den Ordner.



  • brauch man für createdirectory noch ne extra header datei?

    und was muss ich bei shgetspecialfolderpath in die klammer schreiben?



  • Google ist dein Freund.
    In diesem Fall die MSDN.


Anmelden zum Antworten