发布网友 发布时间:2022-04-24 02:54
共3个回答
热心网友 时间:2023-10-23 05:03
问题1:
两种方法都可以,如果给SetTimer的最后一个参数传入NULL,需要添加WM_TIMER消息映射,让VC自动生成OnTimer函数;如果传入一个回调函数地址,系统就会调用你写的回调函数。除了写法略有不同,二者几乎没啥区别的。如果你要设置多个计时器,如果使用OnTimer函数,需要在其内部区分计时器ID值;如果使用回调函数,可以为每个定时器传入不同的回调函数,这就它们的区别。
问题2:
如果使用OnTimer函数,必须在窗口类内部添加WM_TIMER消息映射,并在窗口类内部实现OnTimer进行消息响应。如果使用回调函数,这个函数可以是全局的。
回调函数的声明可以是这样:
void CALLBACK MyTimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)
参数1是设置定时器的窗口句柄,参数2是消息类型,也就是WM_TIMER,参数3是定时器ID,参数4是时间延迟。
你的程序没有创建窗口,不能使用定时器,定时器是依赖于窗口消息的,你必须指定一个处理WM_TIMER消息的窗口。追问感谢高手的回答,感谢。但是,如果就按上面那么写的话,还有别的办法实现定时器么?我要用C++启动一个程序,还要对这个程序进行监听,监听一定是隔一段时间就进行一次,要实现这个,是否还有别的办法?愿意多奉献三十分
追答Windows提供了一种可等待的计时器,它可以定时触发一个定时器对象,可以定时唤醒一个等待该对象的线程。(如果不懂Windows内核对象和触发对象的概念,请参阅《Windows核心编程》)使用它就不必创建一个窗口。因为不像用户计时器那样使用大量用户界面基础设施,消耗的资源较少,而且因为可等待计时器是内核对象,所以它可以在多个线程间共享,还可以具备安全性。只是使用方法要复杂些。
你可以创建一个新的用于等待可等待即使其对象的线程,假设每两秒计时器触发一次,线程函数的代码如下:
HANDLE g_hTimer;
UINT ThreadProc(LPVOID pParam)
{
LARGE_INTEGER li;
// Create an auto-reset timer.
g_hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// The timer will go off direct.
li.QuadPart = 0;
// Set the timer.
SetWaitableTimer(g_hTimer, &li, 2*1000, NULL, NULL, FALSE);
while(TRUE)
{
// When g_hTimer is triggered, WaitForSingleObject return.
WaitForSingleObject(g_hTimer, INFINITE);
// The work
MessageBox(NULL, "计时器触发!", "提示", MB_OK);
}
}
要关闭计时器对象时,可以在其他线程中调用CancelWaitableTimer(g_hTimer);
对于CreateWaitableTimer和SetWaitableTimer函数参数的具体释义,可参考相关资料。
热心网友 时间:2023-10-23 05:04
settimer的最后一个参数不就是你的回调函数名吗。。。。当然你用缺省的也没啥不可以
热心网友 时间:2023-10-23 05:04
SetTimer只能在窗口中使用,不是窗口程序在哪里写触发代码?对吧
用Sleep()吧,Sleep()使用的*很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}
热心网友 时间:2023-10-23 05:03
问题1:
两种方法都可以,如果给SetTimer的最后一个参数传入NULL,需要添加WM_TIMER消息映射,让VC自动生成OnTimer函数;如果传入一个回调函数地址,系统就会调用你写的回调函数。除了写法略有不同,二者几乎没啥区别的。如果你要设置多个计时器,如果使用OnTimer函数,需要在其内部区分计时器ID值;如果使用回调函数,可以为每个定时器传入不同的回调函数,这就它们的区别。
问题2:
如果使用OnTimer函数,必须在窗口类内部添加WM_TIMER消息映射,并在窗口类内部实现OnTimer进行消息响应。如果使用回调函数,这个函数可以是全局的。
回调函数的声明可以是这样:
void CALLBACK MyTimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)
参数1是设置定时器的窗口句柄,参数2是消息类型,也就是WM_TIMER,参数3是定时器ID,参数4是时间延迟。
你的程序没有创建窗口,不能使用定时器,定时器是依赖于窗口消息的,你必须指定一个处理WM_TIMER消息的窗口。追问感谢高手的回答,感谢。但是,如果就按上面那么写的话,还有别的办法实现定时器么?我要用C++启动一个程序,还要对这个程序进行监听,监听一定是隔一段时间就进行一次,要实现这个,是否还有别的办法?愿意多奉献三十分
追答Windows提供了一种可等待的计时器,它可以定时触发一个定时器对象,可以定时唤醒一个等待该对象的线程。(如果不懂Windows内核对象和触发对象的概念,请参阅《Windows核心编程》)使用它就不必创建一个窗口。因为不像用户计时器那样使用大量用户界面基础设施,消耗的资源较少,而且因为可等待计时器是内核对象,所以它可以在多个线程间共享,还可以具备安全性。只是使用方法要复杂些。
你可以创建一个新的用于等待可等待即使其对象的线程,假设每两秒计时器触发一次,线程函数的代码如下:
HANDLE g_hTimer;
UINT ThreadProc(LPVOID pParam)
{
LARGE_INTEGER li;
// Create an auto-reset timer.
g_hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// The timer will go off direct.
li.QuadPart = 0;
// Set the timer.
SetWaitableTimer(g_hTimer, &li, 2*1000, NULL, NULL, FALSE);
while(TRUE)
{
// When g_hTimer is triggered, WaitForSingleObject return.
WaitForSingleObject(g_hTimer, INFINITE);
// The work
MessageBox(NULL, "计时器触发!", "提示", MB_OK);
}
}
要关闭计时器对象时,可以在其他线程中调用CancelWaitableTimer(g_hTimer);
对于CreateWaitableTimer和SetWaitableTimer函数参数的具体释义,可参考相关资料。
热心网友 时间:2023-10-23 05:03
问题1:
两种方法都可以,如果给SetTimer的最后一个参数传入NULL,需要添加WM_TIMER消息映射,让VC自动生成OnTimer函数;如果传入一个回调函数地址,系统就会调用你写的回调函数。除了写法略有不同,二者几乎没啥区别的。如果你要设置多个计时器,如果使用OnTimer函数,需要在其内部区分计时器ID值;如果使用回调函数,可以为每个定时器传入不同的回调函数,这就它们的区别。
问题2:
如果使用OnTimer函数,必须在窗口类内部添加WM_TIMER消息映射,并在窗口类内部实现OnTimer进行消息响应。如果使用回调函数,这个函数可以是全局的。
回调函数的声明可以是这样:
void CALLBACK MyTimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)
参数1是设置定时器的窗口句柄,参数2是消息类型,也就是WM_TIMER,参数3是定时器ID,参数4是时间延迟。
你的程序没有创建窗口,不能使用定时器,定时器是依赖于窗口消息的,你必须指定一个处理WM_TIMER消息的窗口。追问感谢高手的回答,感谢。但是,如果就按上面那么写的话,还有别的办法实现定时器么?我要用C++启动一个程序,还要对这个程序进行监听,监听一定是隔一段时间就进行一次,要实现这个,是否还有别的办法?愿意多奉献三十分
追答Windows提供了一种可等待的计时器,它可以定时触发一个定时器对象,可以定时唤醒一个等待该对象的线程。(如果不懂Windows内核对象和触发对象的概念,请参阅《Windows核心编程》)使用它就不必创建一个窗口。因为不像用户计时器那样使用大量用户界面基础设施,消耗的资源较少,而且因为可等待计时器是内核对象,所以它可以在多个线程间共享,还可以具备安全性。只是使用方法要复杂些。
你可以创建一个新的用于等待可等待即使其对象的线程,假设每两秒计时器触发一次,线程函数的代码如下:
HANDLE g_hTimer;
UINT ThreadProc(LPVOID pParam)
{
LARGE_INTEGER li;
// Create an auto-reset timer.
g_hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// The timer will go off direct.
li.QuadPart = 0;
// Set the timer.
SetWaitableTimer(g_hTimer, &li, 2*1000, NULL, NULL, FALSE);
while(TRUE)
{
// When g_hTimer is triggered, WaitForSingleObject return.
WaitForSingleObject(g_hTimer, INFINITE);
// The work
MessageBox(NULL, "计时器触发!", "提示", MB_OK);
}
}
要关闭计时器对象时,可以在其他线程中调用CancelWaitableTimer(g_hTimer);
对于CreateWaitableTimer和SetWaitableTimer函数参数的具体释义,可参考相关资料。
热心网友 时间:2023-10-23 05:04
settimer的最后一个参数不就是你的回调函数名吗。。。。当然你用缺省的也没啥不可以
热心网友 时间:2023-10-23 05:03
问题1:
两种方法都可以,如果给SetTimer的最后一个参数传入NULL,需要添加WM_TIMER消息映射,让VC自动生成OnTimer函数;如果传入一个回调函数地址,系统就会调用你写的回调函数。除了写法略有不同,二者几乎没啥区别的。如果你要设置多个计时器,如果使用OnTimer函数,需要在其内部区分计时器ID值;如果使用回调函数,可以为每个定时器传入不同的回调函数,这就它们的区别。
问题2:
如果使用OnTimer函数,必须在窗口类内部添加WM_TIMER消息映射,并在窗口类内部实现OnTimer进行消息响应。如果使用回调函数,这个函数可以是全局的。
回调函数的声明可以是这样:
void CALLBACK MyTimerProc(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime)
参数1是设置定时器的窗口句柄,参数2是消息类型,也就是WM_TIMER,参数3是定时器ID,参数4是时间延迟。
你的程序没有创建窗口,不能使用定时器,定时器是依赖于窗口消息的,你必须指定一个处理WM_TIMER消息的窗口。追问感谢高手的回答,感谢。但是,如果就按上面那么写的话,还有别的办法实现定时器么?我要用C++启动一个程序,还要对这个程序进行监听,监听一定是隔一段时间就进行一次,要实现这个,是否还有别的办法?愿意多奉献三十分
追答Windows提供了一种可等待的计时器,它可以定时触发一个定时器对象,可以定时唤醒一个等待该对象的线程。(如果不懂Windows内核对象和触发对象的概念,请参阅《Windows核心编程》)使用它就不必创建一个窗口。因为不像用户计时器那样使用大量用户界面基础设施,消耗的资源较少,而且因为可等待计时器是内核对象,所以它可以在多个线程间共享,还可以具备安全性。只是使用方法要复杂些。
你可以创建一个新的用于等待可等待即使其对象的线程,假设每两秒计时器触发一次,线程函数的代码如下:
HANDLE g_hTimer;
UINT ThreadProc(LPVOID pParam)
{
LARGE_INTEGER li;
// Create an auto-reset timer.
g_hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
// The timer will go off direct.
li.QuadPart = 0;
// Set the timer.
SetWaitableTimer(g_hTimer, &li, 2*1000, NULL, NULL, FALSE);
while(TRUE)
{
// When g_hTimer is triggered, WaitForSingleObject return.
WaitForSingleObject(g_hTimer, INFINITE);
// The work
MessageBox(NULL, "计时器触发!", "提示", MB_OK);
}
}
要关闭计时器对象时,可以在其他线程中调用CancelWaitableTimer(g_hTimer);
对于CreateWaitableTimer和SetWaitableTimer函数参数的具体释义,可参考相关资料。
热心网友 时间:2023-10-23 05:04
SetTimer只能在窗口中使用,不是窗口程序在哪里写触发代码?对吧
用Sleep()吧,Sleep()使用的*很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}
热心网友 时间:2023-10-23 05:04
settimer的最后一个参数不就是你的回调函数名吗。。。。当然你用缺省的也没啥不可以
热心网友 时间:2023-10-23 05:04
SetTimer只能在窗口中使用,不是窗口程序在哪里写触发代码?对吧
用Sleep()吧,Sleep()使用的*很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}
热心网友 时间:2023-10-23 05:04
settimer的最后一个参数不就是你的回调函数名吗。。。。当然你用缺省的也没啥不可以
热心网友 时间:2023-10-23 05:04
SetTimer只能在窗口中使用,不是窗口程序在哪里写触发代码?对吧
用Sleep()吧,Sleep()使用的*很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}