MultimediaTimer -> Absturz ??
-
Hallo....
ich schreibe an einem Dialogfeldbasierenden Programm, bei dem ich ein Gerät zu bestimmten Zeitpunkten umschalten will.
Verbunden bin ich mit dem Gerät über einen OLE-Server (COM-Objekt).
Ich benutze einen Multimediatimer aus der WINMM.LIB, um das Gerät zur richtigen Zeit umzuschalten...Die Steuerung aus dem Dialogfeld klappt auch soweit, aber sobald ich einen vorher funktionierenden Befehl in die Funktion, die vom Timer ausgelöst wird schreibe, gibts nen Crash :
"Unbehandelte Ausnahme in NiagraStrg.exe (Kernel32.dll): 0xE06D7363 Microsoft C++Exception"
Ich beschäftige mich erst seit diesem Jahr mit VisualC++ und hab von vielen Zusammenhängen noch nicht so richtig Ahnung.....heißt : ich steh voll auf´m Schlauch....weiss nicht weiter
Kann mir da jemand nen Tip geben, woran das liegen könnte ??
Gruß
Okriv
-
Hallo
Das bedeutet also, dass du den Befehl direkt von der Callback Funktion auslösen lässt? Ist der Befehl lang?
Ich weiss nur, dass es bei Multimedia Timern Probleme geben kann, wenn deine Anweisungen zu lange sind... Dann kriegt er leicht die Krise....Versuch mal, aus der Callback Funktion heraus eine zweite Funktion aufzurufen, welche dann deine Befehle abarbeitet...
Also irgendwie sowas...
void CALLBACK DeineKlasse::TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) { DeineKlasse* obj = (DeineKlasse*) dwUser; obj->MMTimerHandler(wTimerID); //Aufzufufende Funktion }
Ich hätte da noch n' gutes Tutorial über die verschiedenen Timervarianten...
Wann nehm ich welchen Timer und für was...?[url]
http://www.codeproject.com/system/timers_intro.asp
[/url]Da steht das relativ gut beschrieben...
Apropos: Musst du für das umschalten einen genauen Timer verwenden? MultimediaTimer sind ja gedacht dafür, dass du eine ziemlich genaue Auflösung hinkriegst... Wenn du nur sporadisch was auslöst, würde ich mit den
"normalen" Timerfunktionen (SetTimer, KillTimer) der MFC/Win32 mal was probieren...Ist dann sicherer...Gruz Danny
-
Hey Danny,
ich will eine Timergenauigkeit von 20ms realisieren und das hat mit dem Win32-Timer nicht hingehauen...der hatte zwar anscheinend die nötige Genauigkeit gehabt, aber hat nicht jedesmal ausgelöst.... Deswegen hab ich mich irgendwann zu nem Multimedia-Timer durchgerungen.
Meine Timer-Callback-Funktion hab ich nicht selber geschrieben, sondern von nem OpenSource-Projekt von codeprojekt.com übernommen...
http://www.codeproject.com/audio/mult_media_timer.asp
Die sieht so aus :void CALLBACK CMMTimer::TimeProc(UINT uID, UINT UMsg, DWORD dwUser, DWORD dw1, DWORD dw2) { CMMTimer *Timer = reinterpret_cast<CMMTimer *>(dwUser); Timer->m_Milliseconds += Timer->m_Delay; Timer->m_Count++; Timer->NotifyListeners(); }
Ich versteh noch nicht so ganz, wie ich da noch ne zweite Funktion reinschreiben kann.
Sorry, aber mir fehlt für den Timer noch ein bissle das Verständniss....wär cool, wenn jemand mir da weiterhelfen könnte....Gruß
Virko
-
Hallo...
Na ja, bei 20ms Genauigkeit...Würde ich auch nicht die Win32 Option wählen...
Warscheinlich hattest du da genau das Problem, dass die Priorität der WM_TIMER Nachricht nicht an vorderster Stelle steht in der Nachrichtenwarteschlange...
Daher der Effekt, dass der Timer nicht immer auslöste und wenn, dann zu spät...Ich versteh noch nicht so ganz, wie ich da noch ne zweite Funktion reinschreiben kann.
Ich haben mir den Source mal schnell angesehen. Du arbeitest in diesem Fall mit einer fertigen Klasse...
Schau Dir mal den Source der Dialogklasse an, vorallem das da:
BEGIN_MESSAGE_MAP(CMMTimerDemoDlg, CDialog) //{{AFX_MSG_MAP(CMMTimerDemoDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_START, OnStart) ON_BN_CLICKED(IDC_STOP, OnStop) ON_COMMAND(ID_FILE_EXIT, OnFileExit) ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout) ON_CBN_SELCHANGE(IDC_FRAME_RATE, OnSelchangeFrameRate) //}}AFX_MSG_MAP ON_MESSAGE(UWM_START_TIMER, StartTimer) ON_MESSAGE(UWM_UPDATE_ANIMATION, UpdateAnimation) END_MESSAGE_MAP()
Und das da:
// Attach ourselves to the timer so that we can know when a timing event // occurs m_Timer.AttachListener(*this);
Auch das noch:
// Display next cell in animation sequence LRESULT CMMTimerDemoDlg::UpdateAnimation(WPARAM wParam, LPARAM lParam) { // Display next animation cell m_AnimationFrame.SetBitmap(HBITMAP(m_Enterprise[m_CurrentFrame++])); // Kludge for restarting from the first animation cell if(m_CurrentFrame >= ENTERPRISE_CELL_COUNT) { m_CurrentFrame = 0; } return 0; }
Du musst die Nachrichtenbehandlungsroutinen selbst einbauen...
Hier UpdateAnimation...Hoffe konnte helfen....
Gruz Danny
-
Irre ich mich, oder gibt es diese Frage 2x?
http://c-plusplus.net/forum/viewtopic.php?t=93839
http://c-plusplus.net/forum/viewtopic.php?t=93842MfG,
C++ Core
-
-
Hallo....
@C++ Core :
Ich hab irgendwie im falschen Moment das Browser-Fenster aktualisiert, und da hat er´s einfach nochmal gesendet. Hab versucht, den Eintrag wieder zu löschen, aber ging nicht....sooorry.@Danny :
Jo...Vielen Dank für die Mühe, die Du Dir gemacht hast. Ich hab versucht, die Sachen, die den Absturz verursachen in die Funktion (im Beispiel:UpdateAnimation) zu schreiben und es ging !!!!Fettes Merci !!!!!!
Gruß
Okriv
-
Freu
Viel Spass!