Methode per callback aufrufen
-
Hi Professionals,
ich möchte innerhalb einer Klasse einen Timer nutzen, der bei Ablauf eine Methode derselben Klasse aufrufen soll. Das ganze ist für einen ESP32 (Arduino-Framework). Die Problemstellung an sich ist aber allgemeingültig: Die Bekanntmachung der callback-Funktion ist als Funktionszeiger auf eine statische Funktion vorgesehen. Hier soll aber keine statische Funktion sondern eine Methode (innerhalb derselben Klasse) aufgerufen werden.
//----------------------------------------------------------------------------------------------- class MyTimer { private: hw_timer_t* mytimer; void setup(); void onTrigger(); }; //----------------------------------------------------------------------------------------------- void MyTimer::onTrigger() { //do something } //----------------------------------------------------------------------------------------------- void MyTimer::setup() { timerBegin(0, 80, true); //1 MHz; countUp timerAlarmWrite(mytimer, 10 * 1e6, true); //10 sek; autoreload timerAttachInterrupt(mytimer, /* Aufruf onTrigger */, false); }
Meine Frage bezieht sich auf Zeile 19. Dort wird mit dem mittleren Parameter festgelegt, welche (Interrupt-) Routine aufgerufen wird, wenn der Timer auslöst. Die erwartete Signatur des zu übergebenen Parameters lautet (void)(*fn)().
Wie kann ich erreichen, dass die klasseneigene Methode onTrigger aufgerufen wird?
Gruß Joerg
-
@joerg55 gar nicht.
-
@joerg55 sagte in Methode per callback aufrufen:
(void)(*fn)()
Dein
onTrigger
ist aber vom Typ(void)(MyTimer::*)()
...
-
das ist das Problem
-
tl;dr? Don't.
-
dieser Link ist mir hier bei einem ähnlichen Problem schon einmal genannt worden.
Mir ist klar, dass Zeiger auf Methoden äußerst problematisch sind. (z. B. beim Kopieren oder Verschieben u. s. w.).
In meinem speziellen Fall gibt es ausschließlich globale Objekte dieser Klasse, die nicht kopiert und nicht im Speicher bewegt werden.
Habt ihr noch einen Tipp, wie die onTrigger-Funktion (s. o.) aufgerufen werden kann?
-
@joerg55 Oida, Du brauchst a Instanz von deiner Klasse damitst a Memberfunktion (nicht statisch) aufrufen kannst.
-
@joerg55 sagte in Methode per callback aufrufen:
Mir ist klar, dass Zeiger auf Methoden äußerst problematisch sind. (z. B. beim Kopieren oder Verschieben u. s. w.).
Na, sands ned.
-
@joerg55 sagte in Methode per callback aufrufen:
dieser Link ist mir hier bei einem ähnlichen Problem schon einmal genannt worden.
Jo. Und? Nicht verstanden?
-
@joerg55 sagte in Methode per callback aufrufen:
In meinem speziellen Fall gibt es ausschließlich globale Objekte dieser Klasse, die nicht kopiert und nicht im Speicher bewegt werden.
Dann mach doch eine statische Funktion, die dann das die Funktion des globalen Objektes aufruft?
Also:
void global_callback() { the_global_object->member_function(); }
-
@wob Ja, so stehts ja auch in dem Link.
@Swordfish sagte in Methode per callback aufrufen:
Na, sands ned.
#include <iostream> struct foo_t { int value; void a() { std::cout << value << '\n'; } void b() { std::cout << 2 * value << '\n'; } }; typedef void(foo_t::*foo_t_member_function_ptr_t)(); int main() { foo_t foo_a{ 42 }; foo_t foo_b{ 1 }; foo_t_member_function_ptr_t a = &foo_t::a; (foo_a.*a)(); (foo_b.*a)(); // copy: foo_b = foo_a; (foo_a.*a)(); (foo_b.*a)(); foo_t_member_function_ptr_t b = &foo_t::b; (foo_a.*b)(); (foo_b.*b)(); }
-
@Swordfish sagte in Methode per callback aufrufen:
Na, sands ned.
Sorry, das kann ich nicht parsen.
Na: https://www.duden.de/rechtschreibung/na_Interjektion_Partikel?
Sands kenne ich, ist eine Cocktail-Bar. Ansonsten Sande??
ned = nicht?
-
-
@hustbaer sagte in Methode per callback aufrufen:
Is hianz kloa?
hianz = alles? Das habe ich noch nie gehoert. Ich wuerde eher sowas wie "alls" oder "allns" sagen.
Edit: y/z-Fehler beseitigt.
-
@wob
Steirisch/Burgenländisch: hianz = jetzt
(Und das "z" ist ein "z", kein QWERTY<->QWERTZ Tippfehler)
-
@Swordfish sagte in Methode per callback aufrufen:
Jo. Und? Nicht verstanden?
Ja doch, ich hoffe schon. Ich wollte eben nur keine 'externe' Routine a la global_callback() haben, weil ich die Funktionalität kapseln möchte. Ansonsten werden bei mehreren Timerobjekten ja auch wieder mehrere global_callbacks (oder entsprechende Abfragen) notwendig.
Trotzdem besten Dank erstmal für die C++Unterstützung und natürlich für den Sprachkurs
P. S. Für das 'na sands net' - Beispiel reichts bei mir nicht. Kommt unters Kopfkissen... vielleicht lern ichs ja auch noch
-
@hustbaer sagte in Methode per callback aufrufen:
(Und das "z" ist ein "z", kein QWERTY<->QWERTZ Tippfehler)
mist. Habe vorhin ne Flasche Wein aufgemacht. Es zeigt sich. Ich habe eine qwertz-Tastatur, nutze aber normalerweise eine EurKEY-Belegung (=en-us + european letters)
Schreibe gerade auf einem Envy x360, wo die Tastatur eigentlich super ist, nur dass die Idioten von HP die<>|
-Taste auf (-/Shift/AltGr)+Fn+L gelegt haben.
-
@wob Lost in translation?
-
@Swordfish sagte in Methode per callback aufrufen:
@wob Lost in translation?
Irgendwie schon. Du kannst mir Deutsch, Englisch oder Niederländisch (oder Plattdeutsch - da habe ich zumindest Grundkenntnisse) schreiben, aber nicht Österreichisch oder in obskurem Süddeutsch - von den Chuchichäschtli-Personen spreche ich erst gar nicht, obwohl die mit z.B. "Perron" für "Bahnsteig" niederländische Begriffe verwenden, die aus dem Französischem stammen
-
@wob Mocht jo nix. Bei'm red'n kumman'd leit z'samm.