没有窗口,怎么SetTimer
没有窗口,如何SetTimer
CreateThread一个线程,用于后台定时执行某些工作。既然是后台当然就没有HWND,没有HWND就没法使用SetTimer。除了在循环中使用Sleep还有什么方法
------解决方案--------------------
可以WaitForSingleObject一个事件,填上时间,或者就是CreateWaitableTimer等
------解决方案--------------------
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
返回值:
类型:UINT_PTR
如果函数成功,hWnd参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟.
如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.
如果函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.
Setimer没说一定要Hwnd.TIMERPROC lpTimerFunc // 回调函数应该可用调用吧。你试试,我也没试过
------解决方案--------------------
SetTimer跟HWnd没有关系,但跟消息循环有关系,如果是一个工作线程,是不能使用定时器的,你必须调用GetMessage类似的API来产生一个消息循环,举个例子
这就是一个线程函数,这里我是在外部给线程发送一个消息(通过postthreadmessage),在消息响应函数里创建定时器。
------解决方案--------------------
SetTimer处理 回调函数即可,若果没句柄。
句柄是方便在执行一个时间事件以定时器ID做标志。
------解决方案--------------------
CreateThread一个线程,用于后台定时执行某些工作。既然是后台当然就没有HWND,没有HWND就没法使用SetTimer。除了在循环中使用Sleep还有什么方法
------解决方案--------------------
可以WaitForSingleObject一个事件,填上时间,或者就是CreateWaitableTimer等
------解决方案--------------------
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
返回值:
类型:UINT_PTR
如果函数成功,hWnd参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟.
如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.
如果函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.
Setimer没说一定要Hwnd.TIMERPROC lpTimerFunc // 回调函数应该可用调用吧。你试试,我也没试过
------解决方案--------------------
SetTimer跟HWnd没有关系,但跟消息循环有关系,如果是一个工作线程,是不能使用定时器的,你必须调用GetMessage类似的API来产生一个消息循环,举个例子
DWORD CALLBACK CManager::CheckProc(LPVOID lpParameter)
{
CManager* pThis = (CManager*)lpParameter;
if (NULL == pThis)
{
return 0;
}
BOOL bStartedTimer = FALSE;
int nTimerID = 0;
DWORD dwRecvTime = 0;
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_THREAD_RECV_HEART_BEAT:
{
nTimerID = SetTimer(NULL, 1, 1, NULL);
}
break;
case WM_TIMER:
{
if (nTimerID == msg.wParam)
{
}
}
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
这就是一个线程函数,这里我是在外部给线程发送一个消息(通过postthreadmessage),在消息响应函数里创建定时器。
------解决方案--------------------
SetTimer处理 回调函数即可,若果没句柄。
句柄是方便在执行一个时间事件以定时器ID做标志。
------解决方案--------------------
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
struct tm *now;
struct timeb tb;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc2\n");
}
int main() {
int i;
MSG msg;
SetTimer(NULL,0,1000,myTimerProc1);
SetTimer(NULL,0,2000,myTimerProc2);
for (i=0;i<20;i++) {
Sleep(500);
log("In main\n");
if (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main