我想在可等待的计时器中使用文件时间作为到期时间。我已经设法得到当前时间的文件时间,并从我希望计时器关闭的时间减去,这似乎工作得很好。问题是计时器需要文件时间为负,我不知道如何将文件时间转换为负数。
我尝试将结果乘以-1但这给了我一些完全不同的东西。我得到的结果是ULONGLONG作为文件时间,如果有30秒直到计时器应该触发,我将它乘以-1,它变成50000年左右。我试过重铸它,但这没有帮助。
代码如下所示:
FILETIME* ctime = calloc(sizeof(FILETIME), 1);
SystemTimeToFileTime(time, ctime);
FILETIME* ttime = calloc(sizeof(FILETIME), 1);
SystemTimeToFileTime(anntime, ttime);
ULONGLONG qwResult;
ULONGLONG qwResult1;
// Copy the time into a quadword.
qwResult = (((ULONGLONG) ctime->dwHighDateTime) << 32) + ctime->dwLowDateTime;
qwResult1 = (((ULONGLONG) ttime->dwHighDateTime) << 32) + ttime->dwLowDateTime;
qwResult1 -= qwResult;
qwResult1 *= -1; // does not work
ctime是当前时间,ttime是定时器发出信号的时间。所以我需要一种方法将qwResult1变成负的const LARGE_INTEGER,我可以传递给SetWaitableTimer。我不知道如何进行转换,并希望对此事有任何帮助。
答案 0 :(得分:3)
首先,这里有一些定义可以使FILETIME
更容易处理(记住FILETIME
使用100纳秒单位):
#define FILETIMESEC (10000000i64)
#define FILETIMEMIN (FILETIMESEC * 60i64)
#define FILETIMEHOUR (FILETIMEMIN * 60i64)
#define FILETIMEDAY (FILETIMEHOUR * 24i64)
使用SetWaitableTimer
功能可以为 设置一个绝对时间或相对时间的计时器,所以如果你想让计时器从现在开始30秒内关闭,你就不会这样做。 ; t需要先获取当前时间 - 只需指定相对时间偏移量。
要指定相对时间,您需要提供负值。因此,您应该使用LARGE_INTEGER
结构 - 这是一个包含签名LONGLONG
成员的联盟。
LARGE_INTEGER li;
li.QuadPart = -(FILETIMESEC * 30);
SetWaitableTimer(hTimer, &li, 0, 0, 0, FALSE);
这会将计时器设置为在30秒内熄灭。