每隔50ms让他执行一次子程序如何作? 我在对话框中写了一个子程序,我想每隔50ms让他执行一次。如果用定时器来做,怎么做?还有没有其他的方法?谢谢了,各位大侠! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用MFC向导加WM_ONTIMER事件.void C***Dlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch(nIDEvent) { case 1: //执行你的函数 break; default: break; } CDialog::OnTimer(nIDEvent);}在别的地方[比如OnInitDialog()]SetTimer(1,50000,NULL); 使用wm_timer的消息再加定时器 还有自己做个线程,不断查询时间,隔一秒执行一次WM_TIMER阻塞时容易丢失消息 楼上说的差不多了。在ontimer中最好开新线程执行子程序。 建立一线程,线程函数中包括如下代码,就可以了。哈哈。while(1){Sleep(50);yourfunction();} 按楼上说得试了,但它不执行子函数。我在OnTimer中给了一个前局变量,每执行一次它加1。我跟踪这个变量,它没变化。 请问在ontimer如何开一新线程?请大侠指教! ontimer定时不是很准确,建议用线程自己控制。引用“kugou123(酷狗 闭关学习VC++) ”建立一线程,线程函数中包括如下代码,就可以了。哈哈。while(1){Sleep(50);yourfunction();} 楼上说的方法可采用,yourfunction();的代码应该非常快地执行完 to:chinacao 我子程序占用的时间比较多,就不会是“每隔”50ms执行一次。 可以使用多媒体定时器,以下是我以前用过的#include <MMSystem.h>#pragma comment(lib, "winmm.lib")DWORD m_dwad;UINT m_timerID;DWORD mtime;void CALLBACK TimeProc (UINT timerID ,UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 ){ long num =0; num = mtime; mtime = timeGetTime(); num = mtime - num; CString msg; msg.Format("%d",num); AfxMessageBox(msg);} LPTIMECALLBACK mTproc=TimeProc; TIMECAPS tc; UINT wTimerRes,DaTimer; if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR) { wTimerRes = min(tc.wPeriodMin, tc.wPeriodMax); } DWORD time = timeGetTime(); timeBeginPeriod(100); if(DaTimer<tc.wPeriodMin) DaTimer=tc.wPeriodMin; m_timerID = timeSetEvent( 1000, wTimerRes, mTproc, m_dwad, TIME_PERIODIC); 一般WM_TIMER了.要讨论精确的话 响应WM_TIMER不行 消息堵塞不精确.sleep同样,它把时间片先让给别人.时间到了再回来,也不保证精确.总的来说用windows操作系统你就不可能做到精确的响应.因为windows不是实时操作系统.我是这样认为的. 是SetTimer(1, 50, NULL); //50ms一楼写成SetTimer(1, 50000, NULL);//50s所以楼主执行不了 chinacao(多多指教)?Sleep() 应放在后面,第一次执行时不用等待。 OnTimer ()事件 了 或者是 使用 Sleep () WINDOWs 同时支持 20 个时钟 困扰菜鸟我的一个小知识,希望大虾帮助 在不包含另一个类的头文件的情况下如何使用另一个类 关于pow函数 这个问题还是不太明白,达人请进.急~~ 就是喜欢vc 奇怪的语法 菜鸟之问:在哪里可以查看到所有控件? 先有对象还是先执行构造函数? 高分求socks 5 server源代码 为什么?刚才安错了键,不好意思没说完就发表了现在是完整的 如何在对话框的标题栏中显示文字?急 VC中MessageBox不能输入参数,我记得应该有一个可以输入参数的提示框吧,是什么函数来的?
void C***Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
//执行你的函数
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}在别的地方[比如OnInitDialog()]
SetTimer(1,50000,NULL);
再加定时器
while(1)
{
Sleep(50);
yourfunction();
}
我跟踪这个变量,它没变化。
建立一线程,线程函数中包括如下代码,就可以了。哈哈。
while(1)
{
Sleep(50);
yourfunction();
}
我子程序占用的时间比较多,就不会是“每隔”50ms执行一次。
#include <MMSystem.h>
#pragma comment(lib, "winmm.lib")
DWORD m_dwad;
UINT m_timerID;
DWORD mtime;
void CALLBACK TimeProc (UINT timerID ,UINT uMsg,
DWORD dwUser, DWORD dw1, DWORD dw2 )
{
long num =0;
num = mtime;
mtime = timeGetTime();
num = mtime - num;
CString msg;
msg.Format("%d",num);
AfxMessageBox(msg);
}
LPTIMECALLBACK mTproc=TimeProc;
TIMECAPS tc;
UINT wTimerRes,DaTimer;
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR)
{
wTimerRes = min(tc.wPeriodMin, tc.wPeriodMax);
}
DWORD time = timeGetTime();
timeBeginPeriod(100);
if(DaTimer<tc.wPeriodMin) DaTimer=tc.wPeriodMin; m_timerID = timeSetEvent( 1000,
wTimerRes,
mTproc,
m_dwad, TIME_PERIODIC);
一楼写成SetTimer(1, 50000, NULL);//50s
所以楼主执行不了
Sleep() 应放在后面,第一次执行时不用等待。
WINDOWs 同时支持 20 个时钟