PDA

Visualizza la versione completa : [C++] event handler in applicazione console


max_ergolines
04-03-2011, 14:54
Buongiorno a tutti,
sto scrivendo un applicazione win32 console con Embarcadero C++ Builder 2010 ed Indy10, che deve ricevere dei pacchetti UDP.
Ho usato con successo l'oggetto "TIdUDPServer" in programmi Windows ed adesso vorrei usarlo nel programma "console".
L'oggetto TIdUDPServer ha l'event handler "OnUDPRead" che viene generato alla ricezione dei pacchetti. Come faccio ad assegnare all'evento una mia funzione ?
Ho provato a fare semplicemente us->OnUDPRead=TUDPReadEvent(evento_rx_UDP);
Ma il compilatore dą l'errore "E2031 Cannot cast from 'TUDPReadEvent' to 'TUDPReadEvent'
Qualche suggerimento?

Ecco il programma completo:

TIdUDPServer *us;

TUDPReadEvent evento_rx_UDP(TIdUDPListenerThread *AThread, TIdBytes AData, TIdSocketHandle *ABinding)
{ // corpo funzione
return 0;
}

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
us=new TIdUDPServer(NULL);
us->Bindings->Clear();
us->Bindings->Add();
us->Bindings->Items[0]->IP="192.168.1.6";
us->Bindings->Items[0]->Port=30000;
us->OnUDPRead=TUDPReadEvent(evento_rx_UDP); // errore di compilazione : E2031 Cannot cast from 'TUDPReadEvent' to 'TUDPReadEvent'
us->Active=true;
Sleep(1000);
us->Active=false;

delete us;
return 0;
}

max_ergolines
04-03-2011, 16:21
Salve a tutti,
ho trovato la soluzione, spero possa interessare a qualcuno.
La proprietą us->OnUDPRead (punta all'event handler) richiede una funzione "metodo di una classe". Per cui ho creato la classe statica "ceh" con il metodo evento_rx_UDP che ho assegnato a us->OnUDPRead con l'istruzione:
us->OnUDPRead=(TUDPReadEvent)&(ceh.evento_rx_UDP);
Questa soluzione credo sia generalizzabile per un qualsiasi event handler.

Il codice seguente crea un oggetto UDP client che invia un pacchetto ad un oggetto UDP server.
//---------------------------------------------------------------------------

#include "IdBaseComponent.hpp"
#include "IdComponent.hpp"
#include "IdUDPBase.hpp"
#include "IdUDPClient.hpp"
#include "IdUDPServer.hpp"
#include "Inifiles.hpp"

#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdUDPBase"
#pragma link "IdUDPClient"
#pragma link "IdUDPServer"

TIdUDPClient *uc;
TIdUDPServer *us;

class Tceh {
public:
void __fastcall evento_rx_UDP(TIdUDPListenerThread *AThread, TIdBytes AData, TIdSocketHandle *ABinding);
} ceh;

void __fastcall Tceh::evento_rx_UDP(TIdUDPListenerThread *AThread, TIdBytes AData, TIdSocketHandle *ABinding)
{
printf("pkt ricevuto\n");
return ;
}


#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{

uc=new TIdUDPClient(NULL);
us=new TIdUDPServer(NULL);

us->Bindings->Clear();
us->Bindings->Add();
us->Bindings->Items[0]->IP="192.168.1.6";
us->Bindings->Items[0]->Port=30000;

// assegnazione della funzione che gestisce l'evento:
us->OnUDPRead=(TUDPReadEvent)&(ceh.evento_rx_UDP);

us->Active=true;

uc->Host="192.168.1.6";
uc->Port=30000;
uc->Connect();
uc->Send("prova");
uc->Disconnect();

us->Active=false;
printf("ok\n");

int i=getchar();

delete uc,us;
return 0;
}
//---------------------------------------------------------------------------

Loading