Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将Filetime转换为在计时器中使用_C_Winapi - Fatal编程技术网

C 将Filetime转换为在计时器中使用

C 将Filetime转换为在计时器中使用,c,winapi,C,Winapi,我想使用filetime作为可等待计时器中的到期时间。我已经设法得到了当前时间的filetime,并从我希望计时器启动的时间中减去它,这似乎工作得很好。问题是计时器需要负的filetime,我不知道如何将filetime转换为负 我试着将结果乘以-1,但结果完全不同。我在一个长为filetime的文件中得到结果,如果还有30秒计时器应该启动,我将它乘以-1,它会变成50000年左右。我试着重铸它,但没用 代码如下所示: FILETIME* ctime = calloc(sizeof(FILETI

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

我试着将结果乘以-1,但结果完全不同。我在一个长为filetime的文件中得到结果,如果还有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
FILETIME*ctime=calloc(sizeof(FILETIME),1);
系统时间到文件时间(时间,ctime);
FILETIME*ttime=calloc(sizeof(FILETIME),1);
系统时间到文件时间(anntime,ttime);
乌龙龙qwResult;
乌龙龙qwResult1;
//把时间复制成四字。
qwResult=(((ULONGLONG)ctime->dwHighDateTime)dwLowDateTime;
qwResult1=((ULONGLONG)ttime->dwHighDateTime)dwLowDateTime;
qwResult1-=qwResult;
qwResult1*=-1;//不工作

ctime是当前时间,ttime是计时器发出信号的时间。因此,我需要一种方法将qwResult1转换为负常量大整数,然后传递给SetWaitableTimer。我不知道如何进行转换,希望您能在这方面提供帮助。

首先,这里有一些定义可以帮助处理
文件时间更简单(请记住
FILETIME
使用100纳秒单位):

该函数允许您为绝对时间或相对时间设置计时器,因此,如果您希望计时器在30秒后熄灭,则无需先获取当前时间-只需指定相对时间偏移

要指定相对时间,您需要提供一个负值。因此,您应该使用
LARGE\u INTEGER
结构-这是一个包含有符号
LONGLONG
成员的并集

LARGE_INTEGER li;
li.QuadPart = -(FILETIMESEC * 30);
SetWaitableTimer(hTimer, &li, 0, 0, 0, FALSE);

这将设置计时器在30秒后关闭。

假设
qwResult
总是比
qwResult1
小(早),您只需反转操作:
qwResult-=qwResult1
,这将给您一个负值。(这相当于
4-8=-4
)这似乎是一个不错的选择,我是否可以将该值粘贴回
FILETIME
并将其转换为
const-LARGE_-INTEGER
以传递给
SetWaitableTimer()
?我尝试了反转减法,但它仍然给我一个对应于50000年左右的值。是的,我知道如何根据用户提供的值设置计时器,但我需要获取当前时间和计时器应该关闭的时间之间的时间,这可能是某个特定日期。例如,如果今天是12:00,我需要计时器要在19:00开始,我需要这两个时间之间的时间跨度如果你有一个绝对时间,你想让计时器停止,那么你可以直接在
SetWaitableTimer
中使用它-你根本不需要计算偏移量。记住,正值表示绝对时间,负值表示相对时间。我有一个相对时间,但是我需要获取当前时间。以及用户希望计时器关闭的时间。将这些时间转换为filetime,因为你无法在systemtime上进行算术并获取时间差,然后在
SetWaitableTimer
中使用它。我现在明白你的意思。我必须做更多的研究来找出它。但我使用绝对时间解决了它。我用
LocalFileTimeToFileTime
转换了
ttime
,然后将其转换为
const-LARGE\u-INTEGER*
,并将其发送给运行良好的计时器。感谢您的帮助。
LARGE_INTEGER li;
li.QuadPart = -(FILETIMESEC * 30);
SetWaitableTimer(hTimer, &li, 0, 0, 0, FALSE);