M
Ich hab's jetzt so geändert. Und so funktionierts.
int main (int argc, char **argv)
{
hTi_Test = CreateWaitableTimer (NULL, false, NAME_TI);
if (hTi_Test == NULL)
{
cout << endl << "Erstellung des Timers fehlgeschlagen!";
return -1;
}
SYSTEMTIME sTime;
LARGE_INTEGER liTime;
liTime.QuadPart = 1;
while (liTime.QuadPart != 0)
{
memset (&liTime, 0, sizeof(liTime));
cout << endl << "Timerlaenge angeben [in 100ns]: ";
cin >> liTime.QuadPart;
if (liTime.QuadPart == 0)
break;
ResetTimer (liTime);
if ((SleepEx (3000, true)) == 0)
cout << endl << endl << "Timer noch nicht abgelaufen!" << endl;
else
cout << endl << endl << "APC-Aufruf!" << endl;
}
CancelWaitableTimer (hTi_Test);
CloseHandle (hTi_Test);
return 0;
}
Der Grund war:
Jeffrey Richter - Microsoft Windows, Programmierung für Experten schrieb:
HANDLE hTimer = CreateWaitableTimer (....);
SetWaitableTimer (hTimer, ..., TimerAPCRoutine, ...);
WaitForSingleObjectEx (hTimer, INFINITE, true);
Derartiger Code ist zu vermeiden, da der Aufruf von WaitForSingleObjectEx in Wirklichkeit ein zweifaches Warten impliziert, einmal per Alarmierung und zum zweiten über ein Handle für ein Kernel-Objekt. Wenn der Zeitgeber in den signalisierten Zustand wechselt, war das Warten erfolgreich und der Thread wird aktiviert. Letzteres bewirkt ein Verlassen des alarmierbaren Zustands, weshalb die APC-Prozedur nicht aufgerufen wird. [...]