关于C++里面,SetTimer问题,回调函数用TimerProc还是OnTime?
其中有两个问题:1.在我自己定义的类中添加SetTimer,其中最后一个回调函数用TimerProc还是OnTime?为什我我在网上查有的用TimerProc,也有人用O...
其中有两个问题:1.在我自己定义的类中添加SetTimer,其中最后一个回调函数用TimerProc还是OnTime?为什我我在网上查有的用TimerProc,也有人用Ontime,两个有什么区别? 2.我在VC6.0编译器下,建立Win32 Application工程,能否在我自定义类中添加定时器和回调函数?可以的话,简单的语法是什么样?(小弟学java,对C++语法不是很熟悉,但刚巧做东西用到这个了,所以还希望各位前辈不吝赐教, 愿献上三十积分,谢谢大家)
刚刚又在网上查到,SetTimer于窗口,如果我只是建立了一个Win32 Application工程,代码如下
class test1
{private:
LPTSTR lpCommandLine;
STARTUPINFO si;
PROCESS_INFORMATION pi;
public:
test1(LPTSTR l);
void checkprocess();
};
test1::test1(LPTSTR l)
{
ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
ZeroMemory(&si,sizeof(si));
lpCommandLine=l;
int i=CreateProcess(NULL,lpCommandLine, NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
}
void test1::checkprocess()
{
SetTimer(NULL,1,1000,NULL);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
test1 t("Stylepad.exe");
return 0;
}
这样,我可否给test1这个类添加定时器,那我是不是应该把SetTimer作为类里面的一个方法,然后把回调函数也作为一个类的方法写进去,如果能解决问题,愿再献上十积分 展开
刚刚又在网上查到,SetTimer于窗口,如果我只是建立了一个Win32 Application工程,代码如下
class test1
{private:
LPTSTR lpCommandLine;
STARTUPINFO si;
PROCESS_INFORMATION pi;
public:
test1(LPTSTR l);
void checkprocess();
};
test1::test1(LPTSTR l)
{
ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
ZeroMemory(&si,sizeof(si));
lpCommandLine=l;
int i=CreateProcess(NULL,lpCommandLine, NULL, NULL, FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
}
void test1::checkprocess()
{
SetTimer(NULL,1,1000,NULL);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
test1 t("Stylepad.exe");
return 0;
}
这样,我可否给test1这个类添加定时器,那我是不是应该把SetTimer作为类里面的一个方法,然后把回调函数也作为一个类的方法写进去,如果能解决问题,愿再献上十积分 展开
3个回答
展开全部
问题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消息的窗口。
两种方法都可以,如果给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函数参数的具体释义,可参考相关资料。
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
展开全部
settimer的最后一个参数不就是你的回调函数名吗。。。。当然你用缺省的也没啥不可以
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SetTimer只能在窗口中使用,不是窗口程序在哪里写触发代码?对吧
用Sleep()吧,Sleep()使用的限制很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}
用Sleep()吧,Sleep()使用的限制很小,也很方便。
#include <windows.h>
int main()
{
for(;;)
{
Sleep(1000);//程序停顿1000毫秒
……//你自己的代码
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询