code verbessern



  • hi,
    hab mir ein kleines Marco geschrieben, funktioniert ist aber nicht schön.
    Besonders das Sleep() gefällt mir nicht. Gibt es eine Möglichkeit das er nur solange wartet bis die vorherige Zeile komplett ausgeführt ist? Was kann man sonst noch verbessern?

    Das Programm öffnet Wiedergabegeräte und aktiviert entweder mein Headset oder die Boxen als Standard Anwendung.

    Hier der code:

    #include <windows.h>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	//Variablendeff.
    	HWND handle; 
    	ifstream f;  			
    	string s;
    
    	f.open("test.dat", ios::in); 	// Öffne Datei aus Parameter
    	getline(f, s);        		// Lese eine Zeile
    	f.close();                		// Datei wieder schließen
    
    	system("D:\\Programierzeug\\Ager.lnk"); //Öffen der Verknüpfung
    
    	Sleep(200);	//warte bis geöffnet wurde
    
    	handle = FindWindow(NULL,"sound"); //finde Fenster
    	Sleep(100);
    	SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund
    	Sleep(100);
    	RECT *rect = (RECT*)malloc(sizeof(RECT)); //ermittle Posiotion des Fensters
    	GetWindowRect(handle,rect);
    
    	int i = atoi(s.c_str());  //string to int
    
        if(i == 1)
        {	//Lautsprecher
    	    SetCursorPos(rect->left+164, rect->top+180);
    	    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    	    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    
    	    SetCursorPos(rect->left+241, rect->top+393);
    	    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    	    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    
    	    SetCursorPos(rect->left+196, rect->top+435);
    	    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    	    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    
    	    fstream f;
    	    f.open("test.dat", ios::out);
    		f << "2" << endl;	//speichern in test.dat
    		f.close(); 
        }
    .....
    


  • Geht mit reinem C++ nicht, ich verschieb Dich mal nach WinAPI.



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sagexs schrieb:

    Gibt es eine Möglichkeit das er nur solange wartet bis die vorherige Zeile komplett ausgeführt ist?

    ein thread läuft immer sequenziell, die zweile zeile wird immer nach der ersten
    ausgeführt, oder wie meinst du das?

    Sleep(200);    //warte bis geöffnet wurde
    
    handle = FindWindow(NULL,"sound"); //finde Fenster
    Sleep(100);
    

    das kannst du wohl optimieren:

    while (!handle = FindWindow(0, "sound"))
        Sleep(100);
    

    nachdem du das handle hast, musst du nicht warten, sondern kannst sofort
    weitermachen.



  • Sleep lässt einen Prozess für die angegebene Zeit - wie der Name sagt - vollständig schlafen. Er tut also in dieser Zeit nichts und gibt die Performance während dieser Zeit an andere Prozesse frei. Was du willst ist etwas anderes. Du brauchst wahrscheinlich einen Timer, der zurückmeldet, wann irgendetwas erledigt ist und dann weitergearbeit werden kann.



  • natürlich werden sie der reihe nach ausgeführt, das Problem ist eher das der Rechner nicht hinterher kommt, z.B öffnet sich das Fenster der Wiedergabegeräte erst nach dem die ganzen Klicks ausgeführt wurden, oder aber ehr setzt das Fenster nicht rechtzeitig in den Vordergrund, etc ...

    deswegen habe ich die "Sleep()" dazwischen gesetzt. Leider braucht der Rechner jedes mal Unterschielich viel zeit um die einzelnen Sachen zu laden. Kann ich nicht überprüfen ob die Aktion ausgeführt und beendet wurde bevor die nächste anfängt?



  • Das alles kann man mit WinApi-Funktionen steuern, nur Sleep ist das falsche Werkzeug dafür, weil du nicht wissen kannst, wielange etwas dauert. SendMessage
    wäre auch etwas geeignetes für dich. Dann bestimmst du selbst nach Erhalt der Nachricht, wann etwas laufen kann und soll.
    Edit: Möglicherweise brauchst du aber auch das nicht, wenn Windows das selbst erledigen kann. Der Programmablauf mit Windows ist eben ereignisgesteuert.



  • das kannst du wohl optimieren:

    while (!handle = FindWindow(0, "sound"))
        Sleep(100);
    

    nachdem du das handle hast, musst du nicht warten, sondern kannst sofort
    weitermachen.

    Das sollte eigentlich auch ohne sleep funktionieren.

    while (!handle = FindWindow(0, "sound"));
    

    dann weiter:

    SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund
    while (GetForegroundWindow() != handle));
    


  • erst einmal danke für euere hilfe.

    [quote="manner"]

    Das sollte eigentlich auch ohne sleep funktionieren.

    while (!handle = FindWindow(0, "sound"));
    

    dann weiter:

    SetForegroundWindow(handle); //verschiebe Fenser in den Vordergrund
    while (GetForegroundWindow() != handle));
    

    Funktioniert bei mir beides leider nicht.
    zum ersten: non-vlaue in assignment
    so würde es gehen, bin mir aber nicht sicher ob es das gleiche ist:

    while (!handle){handle = FindWindow(NULL, "sound");}
    

    beim zweiten: geht er bei mir nicht aus der schleife raus.



  • Sagexs schrieb:

    Funktioniert bei mir beides leider nicht.
    zum ersten: non-vlaue in assignment
    so würde es gehen, bin mir aber nicht sicher ob es das gleiche ist:

    while (!handle){handle = FindWindow(NULL, "sound");}
    

    Stimmt, so geht´s besser.

    beim zweiten: geht er bei mir nicht aus der schleife raus.

    probier´s nochmal so:

    while (!GetForegroundWindow() == handle);
    

    theoretisch sollte es gehen, hab´s jetzt aber nich ausprobiert



  • juhuuuu ich habs gelöst 😃

    while (GetForegroundWindow() !=  FindWindow(NULL, "sound"))
    		{
    			SetForegroundWindow(FindWindow(NULL, "sound"));
    }
    

    Das Problem war, das er die Adressen in der zeile

    while (!GetForegroundWindow() == handle);
    

    verglichen hat. Handle war dabei immer ungleich GetForegroundWindow.

    Danke für eure Hilfe :D. Bis zum nächsten Problem!


Anmelden zum Antworten