Timer Queue in Konsolenanwendung: Zugriffsverletzung



  • Hallo zusammen,

    ich bin dabei, in eine Konsolenanwendung (Visual C++ 2010 Express, Windows XP) einen Timer zu integrieren, der mir in einem beliebigen Zeitabstand in der Größenordnung einiger Millisekunden eine Funktion aufrufen soll. Sinn des Ganzen ist die Entwicklung einer Testanwendung die in einem vom Benutzer einzugebenen Zeitabstand zwei CAN-Botschaften absetzt. Da es hier um eine Konsolenanwendung geht ist die Auswahl an Timern ja ohnehin nicht wirklich groß. Ich bin dann auf die TimerQueues gestoßen und versuche nun, mein Problem damit zu lösen.

    Bis zum Sprung von der Callback-Funktion zurück ins Hauptprogramm funktioniert alles ohne Probleme, die Anweisungen in der Callback-Funktion werden ausgeführt. Beim Rücksprung (oder zumindest in der Nähe des Rücksprungs) wird dann folgende Fehlermeldung erzeugt:

    Unbehandelte Ausnahme bei 0x7c93834b in timertest.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x0000000d.

    Ich kenne ähnliche Fehler im Bezug darauf, anstelle von Zeigern den Variableninhalt zu verwenden, aber in diesem Falle hilft mir diese Erkenntnis leider nicht weiter. Wenn ihr Ideen habt woran es liegen könnte, wäre ich um Hilfe dankbar. Für alternative Lösungen ohne Verwendung der TimerQueue wäre ich ebenso offen. Das gepostete Programm stammt übrigens fast 1:1 aus der MSDN, daher wundert es mich um so mehr, dass es nicht funktioniert (scheinbar habe ich irgendwas übersehen).

    Vielen Dank für eure Mithilfe!
    Gruß

    Anbei noch der Quellcode:

    // timertest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    #define _WIN32_WINNT 0x0500
    
    #include "stdafx.h"
    #include <Windows.h>
    
    VOID CALLBACK TimerBearbeitung(void);
    
    HANDLE gDoneEvent;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE hTimer = NULL;
    	HANDLE hTimerQueue = NULL;
    
    	int arg = 123;
    
    	gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    
    	hTimerQueue = CreateTimerQueue();
    
    	CreateTimerQueueTimer(&hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerBearbeitung, &arg, 2000, 0,0);
    
    	WaitForSingleObject(gDoneEvent, INFINITE);
    
    	DeleteTimerQueue(hTimerQueue);
    
    	return 0;
    }
    
    VOID CALLBACK TimerBearbeitung(void)
    {
    	printf("Diest ist ein Test");
    	printf("Dies ist noch ein Test");
    	SetEvent(gDoneEvent);
    
    }
    

  • Mod

    Wie wäre es wen Du Dich einfach an die Doku hällst und den Callback entsprechend definieren würdest?

    http://msdn.microsoft.com/en-us/library/ms687066(v=VS.85).aspx

    VOID CALLBACK WaitOrTimerCallback(
      __in  PVOID lpParameter,
      __in  BOOLEAN TimerOrWaitFired
    );
    


  • Danke, die Parameter habens gerichtet. 👍


Log in to reply