CALLBACK Problem
-
Beim Einrichten einer AudioEngine habe ich eine Callback-Klasse erzeugt, die merkwürdigerweise beim Stop der Dll eine Meldung des just in time debuggers erzeugt.
Die Klasse sieht so aus:
class XTimer { public: XTimer() { }; ~XTimer() { }; CreateMyTime(); CreateMyTime(UINT MyDelay, int typ, LPTIMECALLBACK input); UINT Delay; // Verzögerung DWORD Resolution; // Auflösung in Millisekunden LPTIMECALLBACK Funktion; // Pointer auf die aufzurufende Funktion DWORD UserDaten; // Daten die an die aufrufende Funktion // zurückgegeben werden UINT Timertyp; // TIME_ONESHOT, TIME_PERIODIC int testwert; /////////////////////// Methoden //////////////////////////////// void MMTimerHandler(UINT nIdEvent); CALLBACK Zeitfunktion( UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2 ); }; void CALLBACK XTimerFunction( UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2 ); void CALLBACK AudioTimer( UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2 ); void CALLBACK OggTimer( UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2 ); void CALLBACK TestAudioTimer( UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2 ); #endifund die dazugehörige Funktion
XTimer::CreateMyTime(UINT MyDelay, int typ, LPTIMECALLBACK input) { switch(typ) { case 0: Timertyp = TIME_PERIODIC; break; case 1: Timertyp = TIME_ONESHOT; break; } Delay = MyDelay; testwert = 66; Funktion = input; TIMECAPS tc; timeGetDevCaps(&tc, sizeof(TIMECAPS)); Resolution = min(max(tc.wPeriodMin,0), tc.wPeriodMax); timeBeginPeriod(Resolution); MMRESULT idEvent; idEvent = timeSetEvent( Delay, Resolution, Funktion, //TimerFunction, // hier eine Funktion (DWORD) this, Timertyp); }Die Audio-Klasse funktioniert, das Problem tritt dann auf, wenn ich das Programm verlasse. Ich nehme an, dass der Thread, der durch den Callback erzeugt wird, nicht ordentlich aufgeräumt wird - aber das ist bloß eine dunkle Vermutung.
Die Meldung des "just in time debuggers" ist : "ungültige pid". Sie tritt nicht auf, wenn ich den Timer nicht erzeuge. Da es sich um eine dll handelt, habe ich keinen Anhaltspunkt, wo ich ansetzen kann. So wäre ich, falls niemand eine Antwort weiß, dankbar auch für den Hinweis, welches Tool man zur Lösung eines solchen Problem nutzen kann, um den Fehler im Code zu lokalisieren.
-
Übergib in fuEvent zusätzlich TIME_KILL_SYNCHRONOUS, und räum den Timer mit timeKillEvent weg bevor das Programm terminiert oder die DLL entladen wird.
-
Vielen Dank nochmals, das war die Lösung.

-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.