gpt4 book ai didi

在 c 中为 Windows 操作系统创建中断

转载 作者:可可西里 更新时间:2023-11-01 10:46:50 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <windows.h>
..

int main()
{

while(1)
{
Timer1(); // Timer1 calls the function called TASK1 for every2ms (CreateTimerQueueTimer)
Timer2(); // Timer2 calls the function called TASK2 for every10ms
Timer3(); // Timer3 calls the function called TASK3 for every100ms
}
return 0:
}


int Timer1() // This is only a Timer1 code
{

int arg;
HANDLE Task1;
HANDLE HTimer1 =NULL;
HANDLE HTimerQueue1 = NULL;
Task1 = CreateEvent(NULL, TRUE, FALSE, NULL);
if(NULL == Task1)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return 1;
}

//create a timer queue
HTimerQueue1 = CreateTimerQueue();
if(NULL == HTimerQueue1)
{
printf("CreateTimerQueue failed (%d)\n", GetLastError());
return 2;
}

//phNewTimer - Pointer to a handle; this is an out value
//TimerQueue - Timer queue handle. For the default timer queue, NULL
//Callback - Pointer to the callback function
//Parameter - Value passed to the callback function
//DueTime - Time (milliseconds), before the timer is set to the signaled state for the first time
//Period - Timer period (milliseconds). If zero, timer is signaled only once
//Flags - One or more of the next values (table taken from MSDN):

//set the timer to call the timer routine in 2ms
if(!CreateTimerQueueTimer( &HTimer1, HTimerQueue1, (WAITORTIMERCALLBACK)TASK1, &arg, 0,2,0))
{
printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
return 3;
}


//Delete all timers in the timer queue
if(!DeleteTimerQueue(HTimerQueue1))
printf("DeleteTimerQueue failed (%d)\n", GetLastError());

return 0;
}

我创建了一个调用 TASK1 函数或每 2 毫秒调用一次的 Timer1 函数。我从主函数调用 timer1 函数。我的问题:我将 timer1、timer2 和 timer3 放在 while 循环中,然后按预期调用 TASK 函数。如果我想阻止这个,那我的想法是什么??我想为此创建一个中断吗?如果我删除 while 循环,那么它不会每 2 毫秒、10 毫秒等调用一次该函数。如何为上述程序创建中断??

最佳答案

Msdn删除 DeleteTimerQueueTimer 。如评论中所述,在 while 循环之外执行此操作而不是编写三个时间函数,您可以编写一个带参数的函数。

这是一个简单的未完成的例子

#include <stdio.h>
#include <windows.h>

VOID CALLBACK task1(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
int* arg=(int*)lpParam;
printf("task1 we are called with arg %d\n",*arg);

}

VOID CALLBACK task2(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
int* arg=(int*)lpParam;
printf("task2 we are called with arg %d\n",*arg);
}

VOID CALLBACK task3(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
int* arg=(int*)lpParam;
printf("task3 we are called with arg %d\n",*arg);
}

HANDLE TimerTask(unsigned int period,WAITORTIMERCALLBACK task,void* arg) ;
int main()
{
int arg1=1,arg2=2,arg3=3;

HANDLE h1=TimerTask(2,task1,&arg1) ;
HANDLE h2=TimerTask(10,task2,&arg2) ;
HANDLE h3=TimerTask(8,task3,&arg3) ;

getchar();
return 0;
}

HANDLE TimerTask(unsigned int period,WAITORTIMERCALLBACK task,void* arg)
{

HANDLE HTimer =NULL;

//set the timer to call the timer routine in 2ms
if(!CreateTimerQueueTimer( &HTimer, NULL, (WAITORTIMERCALLBACK)task,(PVOID) arg, 0,period*1000,0))
{
printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
return NULL;
}


return HTimer;
}

关于在 c 中为 Windows 操作系统创建中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20718762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com