mirror of https://github.com/adamdruppe/arsd.git
use waitable timers on windows
This commit is contained in:
parent
a002dbdcd4
commit
de037b37df
|
@ -1314,9 +1314,17 @@ class Timer {
|
||||||
this.onPulse = onPulse;
|
this.onPulse = onPulse;
|
||||||
|
|
||||||
version(Windows) {
|
version(Windows) {
|
||||||
|
/*
|
||||||
handle = SetTimer(null, handle, intervalInMilliseconds, &timerCallback);
|
handle = SetTimer(null, handle, intervalInMilliseconds, &timerCallback);
|
||||||
if(handle == 0)
|
if(handle == 0)
|
||||||
throw new Exception("SetTimer fail");
|
throw new Exception("SetTimer fail");
|
||||||
|
*/
|
||||||
|
|
||||||
|
// thanks to Archival 998 for the WaitableTimer blocks
|
||||||
|
handle = CreateWaitableTimer(null, false, null);
|
||||||
|
long initialTime = 0;
|
||||||
|
if(handle is null || !SetWaitableTimer(handle, cast(LARGE_INTEGER*)&initialTime, intervalInMilliseconds, &timerCallback, handle, false))
|
||||||
|
throw new Exception("SetWaitableTimer Failed");
|
||||||
|
|
||||||
mapping[handle] = this;
|
mapping[handle] = this;
|
||||||
|
|
||||||
|
@ -1359,9 +1367,10 @@ class Timer {
|
||||||
void destroy() {
|
void destroy() {
|
||||||
version(Windows) {
|
version(Windows) {
|
||||||
if(handle) {
|
if(handle) {
|
||||||
KillTimer(null, handle);
|
// KillTimer(null, handle);
|
||||||
|
CancelWaitableTimer(cast(void*)handle);
|
||||||
mapping.remove(handle);
|
mapping.remove(handle);
|
||||||
handle = 0;
|
handle = null;
|
||||||
}
|
}
|
||||||
} else version(linux) {
|
} else version(linux) {
|
||||||
if(fd != -1) {
|
if(fd != -1) {
|
||||||
|
@ -1389,6 +1398,22 @@ class Timer {
|
||||||
destroy();
|
destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void changeTime(int intervalInMilliseconds)
|
||||||
|
{
|
||||||
|
version(Windows)
|
||||||
|
{
|
||||||
|
if(handle)
|
||||||
|
{
|
||||||
|
//handle = SetTimer(null, handle, intervalInMilliseconds, &timerCallback);
|
||||||
|
long initialTime = 0;
|
||||||
|
if(handle is null || !SetWaitableTimer(handle, cast(LARGE_INTEGER*)&initialTime, intervalInMilliseconds, &timerCallback, handle, false))
|
||||||
|
throw new Exception("couldn't change pulse timer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void delegate() onPulse;
|
void delegate() onPulse;
|
||||||
|
@ -1407,7 +1432,8 @@ class Timer {
|
||||||
|
|
||||||
version(Windows)
|
version(Windows)
|
||||||
extern(Windows)
|
extern(Windows)
|
||||||
static void timerCallback(HWND, UINT, UINT_PTR timer, DWORD dwTime) nothrow {
|
//static void timerCallback(HWND, UINT, UINT_PTR timer, DWORD dwTime) nothrow {
|
||||||
|
static void timerCallback(HANDLE timer, DWORD lowTime, DWORD hiTime) nothrow {
|
||||||
if(Timer* t = timer in mapping) {
|
if(Timer* t = timer in mapping) {
|
||||||
try
|
try
|
||||||
(*t).trigger();
|
(*t).trigger();
|
||||||
|
@ -1416,8 +1442,10 @@ class Timer {
|
||||||
}
|
}
|
||||||
|
|
||||||
version(Windows) {
|
version(Windows) {
|
||||||
UINT_PTR handle;
|
//UINT_PTR handle;
|
||||||
static Timer[UINT_PTR] mapping;
|
//static Timer[UINT_PTR] mapping;
|
||||||
|
HANDLE handle;
|
||||||
|
static Timer[HANDLE] mapping;
|
||||||
} else version(linux) {
|
} else version(linux) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
static Timer[int] mapping;
|
static Timer[int] mapping;
|
||||||
|
|
Loading…
Reference in New Issue