控制台应用程序(console)可以使用定时器吗?(就象unix下可以用alarm信号定时)定时执行某个函数? 控制台应用程序(console)可以使用定时器吗?(就象unix下可以用alarm信号定时)定时执行某个函数? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好像不行,方正我是没有找到,只有用线程+Sleep来实现了。 好象不行的,Win32中的Timer是靠发消息的,而消息的处理必须有窗口.如果要求定时执行某个函数要求不很精确的话可以用waitforsingleobject(),sleep()等等..呵呵,其他高手指教.... 我自定义了一个TIMEPROC,用在SetTimer里SetTimer(0,0,1000,myfunc)返回值为 〉0的,也就是成功调用settimer可是,1秒以后,没有执行那个函数myfunc!!!!(函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime){ FILE * fp ;if((fp = fopen("test.txt","w")) ==NULL) return ;fputs("success",fp);fclose(fp);return ;} 我自定义了一个TIMEPROC,用在SetTimer里SetTimer(0,0,1000,myfunc)0A返回值为 〉0的,也就是成功调用settimer可是,1秒以后,没有执行那个函数myfunc!!!!(函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime)0D{ FILE * fp ;if((fp = fopen("test.txt","w")) ==NULL) return ;fputs("success",fp);fclose(fp);return ;}---------------路漫漫其修远兮吾将上下而求索--------------- 当然可以的。你可以定义一个timeevent在while()中用waitforMutilObject()来取得是timeevent事件 http://vip.6to23.com/NowCan1/tech/timer.htm那这个呢。 我的意思是不影响主程序的运行,就象信号处理一样是否有类似unix下的SIG_ALARM的东西。。 SetTimer是基于消息循环的,你这样用不行。用事件吧,像楼上lizmei001(暗黑) 所说 好象不行的,Win32中的Timer是靠发消息的,定义了一个TIMEPROC,用在SetTimer里SetTimer(0,0,1000,myfunc)0A返回值为 〉0的,也就是成功调用settimer可是,1秒以后,没有执行那个函数myfunc!!!! LARGE_INTEGER liDueTime;HANDLE _hTimer_hTimer = CreateWaitableTimer(NULL, FALSE, NULL); liDueTime.QuadPart = -2000000; //-20000000; SetWaitableTimer(_hEiodTimer, &liDueTime, 5000, NULL, NULL, 0);HANDLE evantHandles[0] = _hTimer;....while(1){ int dwWaitRes = WSAWaitForMultipleEvents(4, eventHandles, FALSE, WSA_INFINITE, FALSE) if(dwWaritRes == WSA_WAIT_EVENT_0) {//the set timer event is touching off and wirte you code this}} 我还要做别的事呢!在主函数里(监控端口)。楼上 lizmei001(暗黑) 的代码是对的,可是我不太好用。(考虑到移植、封装性。。)我找到了一个,timeSetEvent可是#include <stdio.h>#include <windows.h>#include <mmsystem.h>void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2){ printf("\nOK\n");}int main(){ long ret ; ret = timeSetEvent(1000,0,( LPTIMECALLBACK )sig_forwin,0,TIME_ONESHOT); printf("ret = %d\n",ret); getchar(); return 0 ;}这段代码在屏幕上打印出 OK 后出错!望指教! 知道原因了:)回到该主题:显然,用SetTimer不能实现功能。可以使用 lizmei001(暗黑) 的代码实现但是也可以使用我的刚才的代码将定义void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)修改为void CALLBACK sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)一样能实现!他用的是多媒体定时器。需要 winmm.lib 支持 应该可以用的吧。int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ int nID=SetTimer(0,0,2000,SetTime); MSG msg; GetMessage(&msg,NULL,0,0); if(msg.message==WM_TIMER) { MesssgeBox(NULL,"定时结束","",0); KillTiemr(nID); } return 0;} 串口通信的接收数据显示 表格字段属性用什么数据类型存储,怎么保存? [在线等]datagrid显示不出来? 请教高手 好奇怪,询问为什么? 关于com组件注册失败 请问如何得到鼠标所在的窗口句柄 位图操作高手请进!!!!!! COM开发指的是什么???? EDITBOX回滚显示数据的问题 高分求教 大家有听说系统工程师考试的吗?
如果要求定时执行某个函数要求不很精确的话可以用waitforsingleobject(),sleep()等等..
呵呵,其他高手指教....
SetTimer(0,0,1000,myfunc)
返回值为 〉0的,也就是成功调用settimer
可是,1秒以后,没有执行那个函数myfunc!!!!
(函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime)
{
FILE * fp ;
if((fp = fopen("test.txt","w")) ==NULL) return ;
fputs("success",fp);
fclose(fp);
return ;
}
SetTimer(0,0,1000,myfunc)
0A返回值为 〉0的,也就是成功调用settimer
可是,1秒以后,没有执行那个函数myfunc!!!!
(函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime)0D
{
FILE * fp ;
if((fp = fopen("test.txt","w")) ==NULL) return ;
fputs("success",fp);
fclose(fp);
return ;
}---------------
路漫漫其修远兮
吾将上下而求索
---------------
你可以定义一个timeevent
在while()中用waitforMutilObject()来取得是timeevent事件
那这个呢。
是否有类似unix下的SIG_ALARM的东西。。
用事件吧,像楼上lizmei001(暗黑) 所说
SetTimer(0,0,1000,myfunc)
0A返回值为 〉0的,也就是成功调用settimer
可是,1秒以后,没有执行那个函数myfunc!!!!
_hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
liDueTime.QuadPart = -2000000; //-20000000;
SetWaitableTimer(_hEiodTimer, &liDueTime, 5000, NULL, NULL, 0);
HANDLE evantHandles[0] = _hTimer;
....
while(1)
{
int dwWaitRes = WSAWaitForMultipleEvents(4, eventHandles, FALSE, WSA_INFINITE, FALSE)
if(dwWaritRes == WSA_WAIT_EVENT_0)
{//the set timer event is touching off and wirte you code this
}
}
楼上 lizmei001(暗黑) 的代码是对的,可是我不太好用。(考虑到移植、封装性。。)我找到了一个,timeSetEvent可是
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)
{
printf("\nOK\n");
}int main()
{
long ret ;
ret = timeSetEvent(1000,0,( LPTIMECALLBACK )sig_forwin,0,TIME_ONESHOT);
printf("ret = %d\n",ret);
getchar(); return 0 ;
}这段代码在屏幕上打印出 OK 后出错!
望指教!
显然,用SetTimer不能实现功能。可以使用 lizmei001(暗黑) 的代码实现
但是也可以使用我的刚才的代码
将定义
void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)修改为
void CALLBACK sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)一样能实现!他用的是多媒体定时器。需要 winmm.lib 支持
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
int nID=SetTimer(0,0,2000,SetTime);
MSG msg;
GetMessage(&msg,NULL,0,0);
if(msg.message==WM_TIMER)
{
MesssgeBox(NULL,"定时结束","",0);
KillTiemr(nID);
}
return 0;
}