2016-03-23 8 views
1

Ich habe einfache C++ Wrapper-Klassen erstellt, aber mein aktuelles Problem ist ein wenig verwirrend. Ich habe eine benutzerdefinierte Hardware, die an einen USB-Port angeschlossen werden kann und bestimmte Informationen abhängig von der Konfiguration der Hardware gibt, auf der verschiedene Event-Handler ausgeführt werden. Es verwendet Ethernet-über-USB-Protokoll. Der C-Code auf der PC-Seite sieht wie folgt aus:Wie erstellt man eine C++ - Wrapper-Klasse für die folgende Art von C-Programm?

// Relevant headers 

int Event1handler(){ 
    // Code to process event 1 
} 

void Event2handler(){ 
    // Code to process event 2 
} 

int main(void){ 
    // Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods 
} 

Jetzt bin ich verwirrt, wie eine C++ Klasse um den obigen Code zu wickeln. Im C-Programm werden die Event-Handler automatisch aufgerufen, je nachdem, welche Informationen vom USB kommen. Wie würde ich die Event-Handler als Methoden einer Klasse implementieren, die automatisch aufgerufen werden, abhängig von den Informationen, die die Hardware sendet? Kann ich den Inhalt der Funktion main() in den Konstruktor der Klasse einfügen?

Edit: Ich brauche keine separaten Methoden für die Klasse. Ich muss nur das C-Programm in eine Klasse einpacken. Es ist auch in Ordnung, alle Event-Handler in eine einzige Methode einzufügen (wenn es überhaupt möglich ist). Ich brauche nur die Daten, die jeder Event-Handler erhält.

Edit2: Hier ist, was die eigentlichen Event-Handler und Anrufe aussehen wie Opensound mit:

// Relevant headers 

int Event1handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){ 
    // Code to process event 1 
} 

void Event2handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){ 
    // Code to process event 2 
} 

int main(void){ 
    // Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods 
    lo_server_thread st; 
    // "if" means one integer and one float 
    lo_server_thread_add_method(st, "/folder/data1", "if", Event1handler, NULL); 
    lo_server_thread_add_method(st, "/folder/data2", "if", Event2handler, NULL); 
} 
+0

Ich kenne Open Sound Control überhaupt nicht, aber viele C-basierte Callback-Systeme (insbesondere GUI) können in einer Klasse zusammengefasst werden. Die Callback-Funktionen sind statische Elementfunktionen. Diese Rückrufe akzeptieren normalerweise einen Zeiger auf benutzerdefinierte Daten. Wenn Sie den Callback im Konstruktor des Objekts einrichten, würden Sie "this" als diese Daten übergeben. Der Callback würde den Zeiger zurück in den Klassentyp konvertieren, dann eine Mitgliedsfunktion aufrufen, um die eigentliche Arbeit zu tun, und irgendwelche zusätzlichen Daten übergeben, die dem Callback übergeben wurden. Ich hoffe, das hilft. –

+0

Danke für den Tipp. Ich fühle es ziemlich relevant. Ich werde nur ein bisschen mehr Code zu meinem Beitrag hinzufügen, so dass Sie sehen können, wie OpenSoundControl funktioniert und wenn Sie denken, dass Ihre Idee anwendbar ist, veröffentlichen Sie bitte einen Beispielcode. – user1420

Antwort

1

einfach eine Klasse erstellen und den Code nach innen zu setzen, zum Beispiel in der .h Datei:

class EventWrapper 
{ 
public: 
    EventWrapper(); 
    static int Event1Handler(); 
    static void Event2Handler(); 
} 

Dann in Ihrer .cpp Datei:

#include "EventWrapper.h" 
// Include relevant headers for your USB device 

EventWrapper::EventWrapper() 
{ 
    // Code to setup calls to Event1handler() and Event2handler() 
    // using Open Sound Control methods. 
} 

int EventWrapper::Event1Handler() 
{ 
    // Code to process event 1 
} 

void EventWrapper::Event2Handler() 
{ 
    // Code to process event 2 
} 

Ohne alle Details Ihres Programms zu kennen, müssen Sie möglicherweise mit dem, was statisch ist, herumspielen und wie Sie damit umgehen wollen.

+0

Danke. Ich dachte, es wäre wie das, was du gepostet hast, aber könntest du mir meinen zweiten Schnitt ansehen, um die Open Sound Control-bezogenen Zeilen zu sehen? Wenn die Hardware Daten für Event1 sendet, wird der EventWrapper :: Event1Handler() automatisch aufgerufen? Das verwirrt mich. Siehe auch einen zusätzlichen Code, den ich gepostet habe. – user1420

+0

Noch eine Frage zu meinem ersten. Es kann sehr trivial sein, aber ... wie kann ich die statischen Elementfunktionen aufrufen, ohne zu wissen, an welche Daten über den USB gesendet werden? – user1420

+0

Diese beiden statischen Member-Funktionen sollten automatisch vom USB-Treibercode aus aufgerufen werden. Sie teilen dem USB-Treibercode mit, dass er diese aufrufen soll, wenn Sie Ihren Verarbeitungscode in diese beiden Funktionen eingeben müssen. – user2205930

Verwandte Themen