wxWidgets - SocketEventHandler



  • Hi,
    ich schreibe momentan an einer Server-Klasse und möchte dabei auf statische Event-Mappings verzichten und stattdessen Connects benutzen.
    Hat bisher mit diversen Command-Events auch ganz gut geklappt, jetzt bin ich jedoch auf ein Problem gestoßen:

    int CServer::start(unsigned short port)
    {
    	const int SOCKET_ID = 1;
    
    	wxIPV4address address;
    	address.Service(port);
    
    	// create socket
    	m_pSocketServer = new wxSocketServer(address);
    	if (!m_pSocketServer->IsOk())
    		return ERR_INVALID_PORT;
    
    	m_isRunning = true;
    
    	// initialise event handler
    	m_pSocketServer->SetEventHandler(*m_pEventHandler, SOCKET_ID);
    	m_pEventHandler->Connect(SOCKET_ID, wxSOCKET_CONNECTION, wxSocketEventHandler(CServer::OnIncomingConnection));
    
    	return ERR_NOERROR;
    }
    
    void CServer::OnIncomingConnection(wxSocketEvent &event)
    {
    	wxSocketBase *sock;
    
    	assert(event.GetSocketEvent() == wxSOCKET_CONNECTION);
    	sock = m_pSocketServer->Accept(false);
    
    	if(sock != NULL)
    		++m_numConnections;
    
    	if(m_pParent != NULL)
    		; // propagate connection
    }
    

    Der Fehler tritt in Zeile 17 auf, hier möchte er nicht mehr kompilieren, mit folgender Fehlermeldung:

    error C2440: 'static_cast': 'void (__thiscall CServer::* )(wxSocketEvent &)' kann nicht in 'wxSocketEventFunction' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    Über das wxSocketEventHandler()-Makro soll die Funktion ja ins richtige Format gecastet werden (#define wxSocketEventHandler(func) (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSocketEventFunction,&func)),
    nur dies scheint hier aus einem mir unbekannten Grund nicht zu funktionieren.
    Hat jemand evtl. eine Ahnung wo hier der Fehler liegen könnte?

    Habe ich vllt. etwas an den Connections allgemein falsch verstanden? Bei den anderen Connections mit wxCommandEvents hat diese Methode bisher immer geklappt.

    Danke für eure Ideen. 😉


  • Mod

    Funktioniert es denn, wenn du es statisch einbindest?

    Auch glaube ich das du noch eine Eventsink angeben solltest (noch 2 parameter: NULL,this an connect dran hängen).



  • Das Problem an der Eventsink ist, dass mein CServer selbst überhaupt kein Eventhandler ist, er ist von keiner wx-Klasse abgeleitet.
    Aus diesem Grund wollte ich den Eventhandler eben extern festlegen, nämlich entweder als Membervariable im CServer, für eine Art Standalone-Version, oder als Zeiger auf ein übergeordnetes wxWindow (m_pEventHandler = m_pParent) wenn der Server von einem solchen wx-Fenster aus implementiert werden soll.

    Könnte hier evtl. der Fehler liegen? Da ja mein CServer an sich kein Evt-Handler ist. Evtl. würde hier doch eine Ableitung von wxEvtHandler Sinn machen - ich werd es mal ausprobieren.


  • Mod

    Ja, das könnnte sein.

    Aber es ändert nichts daran, das die Klasse die den Event bekommen soll die Eventsink ist, d.h. this ist in diesem Fall richtig.


Anmelden zum Antworten