请教高手:定时器的设置 我想设置一个比如1ms或者10ms的时钟,并在控件中显示,就像定时炸弹倒机时,机时不是以秒计。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SetTimer(hwnd,1,1/*10*/,NULL);至于控件的处理就简单的输出啦 1、在WM_CREATE中SetTimer(hWnd,1,1000,NULL);2、在WM_TIMER中进行显示控制OK to风清扬兄,你能否具体一点,我在此函数中更新时间,并显示到控件中void CTlhTimerDlg::UpdateClock(){ time_t time_tCurrentTime; char szBuffer [ 256 ]; time_tCurrentTime = time((time_t*) NULL); strftime(szBuffer,sizeof(szBuffer),"%A",localtime(&time_tCurrentTime)); m_wndDay = szBuffer; strftime(szBuffer,sizeof(szBuffer),"%H",localtime(&time_tCurrentTime)); m_wndHour = szBuffer; strftime(szBuffer,sizeof(szBuffer),"%M",localtime(&time_tCurrentTime)); m_wndMinutes = szBuffer; strftime(szBuffer,sizeof(szBuffer),"%S",localtime(&time_tCurrentTime)); m_wndSeconds = szBuffer; (GetDlgItem (IDC_DAY)) ->SetWindowText(m_wndDay); (GetDlgItem (IDC_HOUR)) ->SetWindowText(m_wndHour); (GetDlgItem (IDC_MINUTES)) ->SetWindowText(m_wndMinutes); (GetDlgItem (IDC_SECONDS)) ->SetWindowText(m_wndSeconds);}我查了msdn,上面对于输出格式“%”中没有关于ms级的输出说明,望高手指点 GetSystemTime 可以得到ms级输出 转载:三种Windows中的定时或计时方法 任何Visual C++的程序员都会利用Windows的WM_TIMER消息映射来进行简单的时间控制:1、调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔;2、在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成定时时间到时的操作。这种定时方法是非常简单的,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况,但在精度要求较高的条件下,这种方法应避免采用。 ---- 在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数(如果读者仍然使用Windows3.1,可以使用GetCurrentTime()函数),该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。以下语句已经使用在大连理工大学海岸和近海工程国家重点实验室为广东省水利水电科学研究所研制开发的液压伺服多向不规则造波机系统的控制程序中。 DWORD dwStart, dwStop ; // 起始值和中止值dwStop = GetTickCount();while(TRUE){ dwStart = dwStop ; // 上一次的中止值变成新的起始值 // …… 此处添加相应控制语句 …… do { dwStop = GetTickCount() ; } while(dwStop - 50 < dwStart) ;}---- 对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求。但作者在为大连基康公司编写快速计数程序时,发现使用GetTickCount()函数对计数结果产生很大影响。为了进一步提高计时精度,作者使用了QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是Visual C++提供的仅供Windows 95及其后续版本使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为: BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) ; BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount) ;---- 数据类型LARGE_INTEGER既可以是一个作为8字节长的整型数,也可以作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下: typedef union _LARGE_INTEGER { struct { DWORD LowPart ; // 4字节整型数 LONG HighPart ; // 4字节整型数 }; LONGLONG QuadPart ; // 8字节整型数 } LARGE_INTEGER ;---- 在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。作者在主频为266、300、333的三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,作者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。下面的程序是用来测试函数Sleep(100)的精确持续时间。 LARGE_INTEGER litmp ;LONGLONG QPart1,QPart2 ;double dfMinus, dfFreq, dfTim ;QueryPerformanceFrequency(&litmp) ; // 获得计数器的时钟频率dfFreq = (double)litmp.QuadPart ;QueryPerformanceCounter(&litmp) ; // 获得初始值QPart1 = litmp.QuadPart ;Sleep(100) ;QueryPerformanceCounter(&litmp) ; // 获得中止值QPart2 = litmp.QuadPart ;dfMinus = (double)(QPart2 - QPart1) ;dfTim = dfMinus / dfFreq ; // 获得对应的时间值---- 执行上面程序,得到的结果为dfTim=0.097143767076216(秒),细心的读者会发现,每次执行的结果都不一样,存在一定的差别,这是由于Sleep()自身的误差所致。 ---- 本文介绍了三种定时或计时的实现方法,读者可以根据自己的实际情况进行选择,以达到程序的定时和计时功能。以上程序均使用Visual C++5.0和6.0在Windows98下调试通过。 SetTimer不能精确到10ms,只能精确到55ms左右,要精确到10m可以用setTimerEvent jeremyhit : 讲得透澈 ,精辟 能留个邮箱联系一下吗可发到我的: [email protected] TO 春子兄,你讲得非常清楚,很是感谢,分是拿定了。但你上面说GetCurrentTime()只能得到计算机启动后的相对时间,而不是当前时间,我要的是当前时间,并将其显示出来,而不是一段程序的执行时间,我所说的就是北京时间。并把它给显示出来,希望指点,分我不在乎多少。 能够得到wMilliseconds值,闪得很快,但上面没有60分之1秒,怎样得到? 头文件不在project目录上,如何设置可以#include找到该文件; OpenProcessToken()函数调用失败 请大家帮忙 磁盘中有个位图的概念,它是什么意思? 高分求非模态对话框的加滚动条的代码,,, 问题:对话框的数据交换机制 RemoveAll引发的问题 关于类似于QQ聊天窗口焦点问题 请大伙帮忙分析.对话框中为什么会提示"执行系统不支持的操作" 关于Task Schedule (派分)COM/DCOM/MTS/COM+的区别?... 如何操作activex控件的属性?up! 关于flash!!
至于控件的处理就简单的输出啦
2、在WM_TIMER中进行显示控制
OK
void CTlhTimerDlg::UpdateClock()
{
time_t time_tCurrentTime;
char szBuffer [ 256 ];
time_tCurrentTime = time((time_t*) NULL); strftime(szBuffer,sizeof(szBuffer),"%A",localtime(&time_tCurrentTime));
m_wndDay = szBuffer;
strftime(szBuffer,sizeof(szBuffer),"%H",localtime(&time_tCurrentTime));
m_wndHour = szBuffer;
strftime(szBuffer,sizeof(szBuffer),"%M",localtime(&time_tCurrentTime));
m_wndMinutes = szBuffer;
strftime(szBuffer,sizeof(szBuffer),"%S",localtime(&time_tCurrentTime));
m_wndSeconds = szBuffer; (GetDlgItem (IDC_DAY)) ->SetWindowText(m_wndDay);
(GetDlgItem (IDC_HOUR)) ->SetWindowText(m_wndHour);
(GetDlgItem (IDC_MINUTES)) ->SetWindowText(m_wndMinutes);
(GetDlgItem (IDC_SECONDS)) ->SetWindowText(m_wndSeconds);}
我查了msdn,上面对于输出格式“%”中没有关于ms级的输出说明,望高手指点
转载:三种Windows中的定时或计时方法 任何Visual C++的程序员都会利用Windows的WM_TIMER消息映射来进行简单的时间控制:1、调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔;2、在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成定时时间到时的操作。这种定时方法是非常简单的,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况,但在精度要求较高的条件下,这种方法应避免采用。 ---- 在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数(如果读者仍然使用Windows3.1,可以使用GetCurrentTime()函数),该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。以下语句已经使用在大连理工大学海岸和近海工程国家重点实验室为广东省水利水电科学研究所研制开发的液压伺服多向不规则造波机系统的控制程序中。 DWORD dwStart, dwStop ; // 起始值和中止值
dwStop = GetTickCount();
while(TRUE)
{
dwStart = dwStop ; // 上一次的中止值变成新的起始值
// …… 此处添加相应控制语句 ……
do
{
dwStop = GetTickCount() ;
} while(dwStop - 50 < dwStart) ;
}---- 对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求。但作者在为大连基康公司编写快速计数程序时,发现使用GetTickCount()函数对计数结果产生很大影响。为了进一步提高计时精度,作者使用了QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是Visual C++提供的仅供Windows 95及其后续版本使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) ;
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount) ;---- 数据类型LARGE_INTEGER既可以是一个作为8字节长的整型数,也可以作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
struct
{
DWORD LowPart ; // 4字节整型数
LONG HighPart ; // 4字节整型数
};
LONGLONG QuadPart ; // 8字节整型数
} LARGE_INTEGER ;---- 在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。作者在主频为266、300、333的三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,作者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。下面的程序是用来测试函数Sleep(100)的精确持续时间。
LARGE_INTEGER litmp ;
LONGLONG QPart1,QPart2 ;
double dfMinus, dfFreq, dfTim ;QueryPerformanceFrequency(&litmp) ;
// 获得计数器的时钟频率
dfFreq = (double)litmp.QuadPart ;QueryPerformanceCounter(&litmp) ;
// 获得初始值
QPart1 = litmp.QuadPart ;Sleep(100) ;QueryPerformanceCounter(&litmp) ;
// 获得中止值
QPart2 = litmp.QuadPart ;dfMinus = (double)(QPart2 - QPart1) ;
dfTim = dfMinus / dfFreq ;
// 获得对应的时间值---- 执行上面程序,得到的结果为dfTim=0.097143767076216(秒),细心的读者会发现,每次执行的结果都不一样,存在一定的差别,这是由于Sleep()自身的误差所致。
---- 本文介绍了三种定时或计时的实现方法,读者可以根据自己的实际情况进行选择,以达到程序的定时和计时功能。以上程序均使用Visual C++5.0和6.0在Windows98下调试通过。
能留个邮箱联系一下吗
可发到我的: [email protected]