转换Filetime以在计时器中使用

时间:2014-07-03 20:33:32

标签: c winapi

我想在可等待的计时器中使用文件时间作为到期时间。我已经设法得到当前时间的文件时间,并从我希望计时器关闭的时间减去,这似乎工作得很好。问题是计时器需要文件时间为负,我不知道如何将文件时间转换为负数。

我尝试将结果乘以-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。我不知道如何进行转换,并希望对此事有任何帮助。

1 个答案:

答案 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秒内熄灭。