Sieht so ein Event handler aus?



  • Ich habe, als ich mir ein erstes c# Programm angeschaut habe, sofort festgestellt, dass dort häufig Eventhandler verwendet werden, um "Reaktionen" auf Buttons eines Fensters zu machen.

    Jetzt habe ich mich gefragt, wie das in c++ aussehen könnte. (Ich habe bereits gesehen, dass es das auch für c++ gibt, aber ich mag es immer lieber mir soetwas selbst zu schreiben, um solche Konzepte besser zu verstehen.

    Es ist eigentlich relativ kurz:

    //Verwendete Header//
    #include <iostream>
    #include <vector>
    #include <thread>
    #include <Windows.h>
    /////////////////////
    
    template <class T, class T2> class MS_EVENT
    {
    	std::vector<T(*)(T2)> events;
    
    public:
    	void operator+=(T(*FctPtr)(T2))
    	{
    		events.push_back(FctPtr);
    	}
    	void operator()(T2 e)
    	{
    		int eSize = events.size();
    		for (int i = 0; i < eSize; i++)
    		{
    			events[i](e);
    		}
    	}
    	void operator=(T(*FctPtr)(T2))
    	{
    		events.clear();
    		events.push_back(FctPtr);
    	}
    };
    

    Ich speicher also die Adressen der Funktionen/Methoden (den Unterschied kenne ich bis heute nicht), die ausgeführt werden sollen (die handler) in einem Vektor im Event. Dieses erstelle ich dann global:

    MS_EVENT<void, int> button1_pressed;
    

    Die Handler könnten so aussehen:

    void handler1(int e)
    {
    	std::cout << "Der erste handler wurde mit dem Wert " << e << " aufgerufen." << std::endl;
    }
    
    void handler2(int e)
    {
    	std::cout << "Der zweite handler wurde mit dem Wert " << e << " aufgerufen." << std::endl;
    }
    

    In der main (oder wo auch immer) binde ich dann die handler an das Event:

    button1_pressed += handler1;
    button1_pressed += handler2;
    

    Jetzt fehlt nur noch der Code, der das Event aufruft. Ich denke, dass das im Normalfall ein Teil des Betriebssystems übernimmt und man die handler eigentlich an diese events hängt, ich habe mir hier einfach etwas geschrieben, was das ersetzen soll:

    enum Nachricht { Pressed, NotPressed };
    
    bool checkLeftMouseButton()
    {
    	if (GetAsyncKeyState(VK_LBUTTON))
    		return 1;
    	return 0;
    }
    
    void systemCheck(int frequence)
    {
    	frequence = 1000 / frequence;
    	while (1)
    	{
    		if (checkLeftMouseButton())
    			button1_pressed(Pressed);
    		Sleep(frequence);
    	}
    }
    

    Das lasse ich dann als unabhängigen thread nebenher laufen:

    std::thread t1(systemCheck, 30);
    t1.detach();
    

    Das Programm erzielt jedenfalls das gewünschte Ergebnis, aber entspricht es auch dem eigentlichen Vorbild eines Events oder habe ich mir hier jetzt einfach etwas anderes "ausgedacht", was einfach nur den gleichen Effekt erzielt?

    (bitte Seht es mir nach, wenn der Code nicht sonderlich professionell ist, ich bin noch ein Anfänger)

    LG
    Anyfail


Anmelden zum Antworten