关于多媒体定时器

LC3030 2009-09-15 09:44:12
我在网上找到了一个网友写的一个多媒体定时器的类,比较简单,基本上就有两个方法:
BOOL CTimeSet::Start(UINT delay,LPTIMECALLBACK pfun,DWORD dwUser, UINT res/*=1*/)
{
Stop();

TimerRes = res; //分辨率
TimerDelay = delay; //延时时间,单位是毫秒
TimerID = timeSetEvent(TimerDelay,TimerRes,pfun,dwUser,TIME_PERIODIC | TIME_KILL_SYNCHRONOUS );//TIME_PERIODIC); //TimerID是定时器的ID,pfun是回调函数
if(TimerID)
return TRUE;
else
return FALSE;
}

void CTimeSet::Stop()
{
if(TimerID)
timeKillEvent(TimerID);
TimerID=0;
}
我在我的程序中定义了一个CTimeSet的对象,然后调用Start设置了每10ms发一个消息。在回调函数中,主要是一些绘图的操作和读数据库的操作(我测试过,这些操作正常情况下仅需4-6ms就可以完成)。当关闭程序时,我就调用Stop关闭定时器。
现在开始说问题了:
1.有时候我关闭程序后,虽然界面消失了,但是在任务管理器那里一看,程序的进程还没结束,我检查了很久也不知道为什么,怀疑是可能关闭程序的时候定时器没有关闭成功,所以进程不能正常结束。
2.由于我的程序要求每10ms要对硬件进行一次操作,并将数据画成曲线显示出来(目前还是用到硬件,仅在电脑上仿真),但是程序运行的时候有时会稍微卡一下(就是正常情况下曲线是匀速地画出来的,但是有时候会稍微停滞一小会然后再加速画出来,最后再变正常速度),请问这是为什么呢?是因为线程的优先级别问题吗?怎么解决呢?
...全文
1154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbbing2004 2009-11-01
  • 打赏
  • 举报
回复
同样的问题,困扰我好长时间了!
LC3030 2009-09-23
  • 打赏
  • 举报
回复
不好意思,这么久才回来

继续发问~~
我是在结束多媒体定时器的时候程序有时跑步过去的,就是在调用timeKillEvent(TimerID)的时候程序偶尔停在
那里跑不了,其他时候基本还算正常。
还有就是我设置多媒体定时器每10ms发一个消息,但是定时器的线程函数在有的时候要隔50ms才调用一次,就是说精度不够大概发10000个消息有15个消息不能满足精度要求,请问有没有什么办法解决的?
可不可以通过设置worker线程和UI线程来解决的?
jameshooo 2009-09-19
  • 打赏
  • 举报
回复
当出现退不出的时候,点击调试环境的暂停执行按钮,在线程窗口中切换至多媒体时钟线程,看看代码中断在哪里,如果在系统模块中,用调用栈查看回调函数位置,很容易找到出错的地方。

这种问题多半发生在清理顺序不对,线程同步发生异常。
LC3030 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 olino 的回复:]
CreateThread函数在创建的时候,默认的是THREAD_PRIORITY_NORMAL

必须通过SetThreadPriority  来设置
[/Quote]
好像SetThreadPriority只能用来微调线程的优先级而已
我在多媒体定时器的回调函数中写了这两句
// HANDLE handle = GetCurrentThread();
// SetThreadPriority( handle, THREAD_PRIORITY_TIME_CRITICAL );
然后用process viewer查看线程优先级,但是线程优先级一直在9-15之间跳动的,好像没什么用
GetCurrentThread()好像得到的不是真正的线程句柄,而是一个伪句柄来的?不知道这样设置行不行的
LC3030 2009-09-16
  • 打赏
  • 举报
回复
我也觉得是因为主线程被卡住了,因为有时候在调试的时候,我点击关闭程序时,程序跑到关闭定时器的地方的时候有时就是跑不过去。我关闭程序的时候会去判断定时器是否已经被停止,如果还没有停止就先停止定时器再继续关闭程序,估计就是这里出问题了,不知道怎么解决。
另外我想问一下,我应该怎么提高多媒体定时器的线程优先级呢?
oLINo 2009-09-16
  • 打赏
  • 举报
回复
CreateThread函数在创建的时候,默认的是THREAD_PRIORITY_NORMAL

必须通过SetThreadPriority 来设置
dirdirdir3 2009-09-15
  • 打赏
  • 举报
回复
绘图的操作和读数据库的操作

有可能是在停止的时候刚好之前你的数据库已经被终结了连接,导致回调函数卡住了.
应该先停止这个timer,再退出其他操作..........个人猜测,具体要你调试看看.............
dirdirdir3 2009-09-15
  • 打赏
  • 举报
回复
1.主线程被卡住了,可能是等什么资源释放..........具体要用windbg调试一下
2.线程是分时复用的,也就是有可能在你的程序运行中间插入其他的进程时间片一个或多个(一个时间片10-20ms),因此时间不能保证.........可以适当提高你的进程的优先度,不过windows本来就不是实时系统,不是宜用作timecritical的软件.............
LC3030 2009-09-15
  • 打赏
  • 举报
回复
楼上,那应该怎么解决呢?
能不能说详细点
MoXiaoRab 2009-09-15
  • 打赏
  • 举报
回复
你的资源没有释放得掉

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧