 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Volz Guest
|
Posted: Wed Apr 21, 2004 12:06 am Post subject: Callback Funktion Problem |
|
|
Hi,
ich habe ein Problem mit einem Timer der eine Callback Funktion aufrufen
soll. Wenn die Funktion außerhalb der Timer-Klasse liegt geht es, aber
wenn es eine Member-Variable der Timer-Klasse ist bekomme ich diesen
Fehler von g++:
Thread.cpp: In member function `virtual bool Timer::StartTimer(long
unsigned int, bool, long unsigned int)':
Thread.cpp:513: error: no matching function for call to `SelectTimer::
timeSetEvent(unsigned int&, <unknown type>, void*,
SelectTimer::<anonymous enum>)'
.../include/Thread.h:403: error: candidates are: bool
SelectTimer::timeSetEvent(unsigned int, void (*)(void*), void*,
unsigned int)
Hier mal ein paar Auszüge aus meinen Klassen. Falls ich noch mehr posten
soll bitte sagen:
void testfunc (void *dwUser)
{
}
bool SelectTimer::timeSetEvent(unsigned int uDelay,
void (*callbackFunc) (void *dwUser),
void *dwUser,
unsigned int fuEvent)
{
....
}
void Timer::CallbackRunner (void *dwUser)
{
....
}
class Timer {
SelectTimer st;
...
}
bool Timer::StartTimer(...)
{
#ifdef GEHT
st.timeSetEvent ((unsigned int) TimeMS,
testfunc,
(void*) this,
Single ? SelectTimer::TIME_ONESHOT :
SelectTimer::TIME_PERIODIC);
#endif
#ifdef GEHT_NICHT
st.timeSetEvent ((unsigned int) TimeMS,
CallbackRunner,
(void*) this,
Single ? SelectTimer::TIME_ONESHOT :
SelectTimer::TIME_PERIODIC);
#endif
}
Das ist jetzt erstmal sehr wenig Code dazu. Vielleicht kann man das
Problem ja schon sehen. Ansonsten schicke ich auch gerne die Klasse oder
den Link dazu an jeden der mir helfen will.
Ach ja, bei timeSetEvent handelt es sich nicht wirklich um die Windows
API-Funktion, sondern um einen Nachbau unter Linux.
Gruß
Andreas
--
Die eMail-Adresse ist existent, aber um das Risiko meines Spamfilters
oder eines vollen Briefkastens zu umgehen, bitte an die gleiche Adresse
ohne "-spam-trap" schicken.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Apr 21, 2004 9:20 am Post subject: Re: Callback Funktion Problem |
|
|
Andreas Volz wrote:
| Quote: | Hi,
ich habe ein Problem mit einem Timer der eine Callback Funktion
aufrufen soll. Wenn die Funktion außerhalb der Timer-Klasse liegt geht
es, aber wenn es eine Member-Variable der Timer-Klasse ist bekomme ich
diesen Fehler von g++:
|
Zeiger auf (nicht-statische) Memberfunktionen sind nicht kompatibel zu
Zeigern auf nicht-Member-Funktionen. Das liegt daran, daß die
Memberfunktion ja nur für ein Objekt aufgerufen werden kann und dann
der this-Zeiger als verstecktes zusäzliches Argument an diese übergeben
werden muß. Du wirst also bei deiner testfunc bleiben müssen. Den
übergebenen void* hast du ja schon mit them this-Zeiger belegt und
brauchst ihn also nur wieder zurückcasten. Dann kannst du von dort die
Memberfunktion aufrufen. Etwa so:
void testfunc (void *dwUser)
{
static_cast<SelectTimer*>(dwUser)->CallbackRunner(dwUser);
}
Wobei die Memberfunktion den void* eigentlich nicht unbedingt braucht.
Sie hat ja den this-Zeiger.
Ach ja, falls das verwendete API in C geschrieben ist, muß deine
testfunc als extern "C" deklariert sein, also:
extern "C" void testfunc (void *dwUser)
....
Falls nicht, kannst du sie auch zur static-Memberfunktion machen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Volz Guest
|
Posted: Wed Apr 21, 2004 9:44 am Post subject: Re: Callback Funktion Problem |
|
|
Am Wed, 21 Apr 2004 11:20:05 +0200 schrieb Rolf Magnus:
| Quote: | Falls nicht, kannst du sie auch zur static-Memberfunktion machen.
|
Ah, das war die Lösung. Tausend Dank! Das hat mich gestern Nacht an den
Rand des Wahnsinns getrieben ;-)
GRuß
Andreas
--
Die eMail-Adresse ist existent, aber um das Risiko meines Spamfilters
oder eines vollen Briefkastens zu umgehen, bitte an die gleiche Adresse
ohne "-spam-trap" schicken.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Gies Guest
|
Posted: Thu May 27, 2004 6:23 pm Post subject: Re: Callback Funktion Problem |
|
|
Andreas Volz hat geschrieben:
| Quote: | Am Wed, 21 Apr 2004 11:20:05 +0200 schrieb Rolf Magnus:
Falls nicht, kannst du sie auch zur static-Memberfunktion machen.
|
Wäre es denn in diesem Fall nicht sinnvoll, sich eine abstrakte
Schnittstelle zu überlegen, über die dann das Timer-Event mittels
simplem Aufruf angestossen wird.
Ist nicht so C mässig wie das direkte herumfuchteln mit Pointern auf
Funktionen und auf der anderen Seite kann man dann direkt ein Objekt
haben. Wenn man dann doch was aus ner C-Library aufrufen muss, dann
könnte man für diesen Fall ja einen Proxy nehmen.
Thomas
--
I'm not the greatest; I'm the double greatest. Not only do I knock 'em
out, I pick the round.
Muhammad Ali, NY Times 9 Dec 62
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|