定时器和线程的问题

real1986061901 2010-11-05 05:15:14
今有两个计时器,计时器1在主程序里,计时器2在主程序将要加载的COM组件里,计时器1的时间间隔为500ms,计时器2的时间间隔为5000ms,计时器2执行操作所用的时间大于500ms,因此不能保证计时器1每隔500ms执行一次,现在打算把计时器2用一个线程来取代,但是计时器2所执行的操作在COM组件里,这样该怎样创建线程和使用线程,或者是否还有更好解决方法?望指点~
...全文
152 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
real1986061901 2010-11-06
  • 打赏
  • 举报
回复
求指点~
real1986061901 2010-11-06
  • 打赏
  • 举报
回复
现在有另外一个问题,在COM里我还引入了另外一个组件,该组件是wmp.dll,但是不能在新建的线程调用wmp.dll的接口,但是可以在新建的线程里调用IE的接口。网上有说用CoMarshalInterThreadInterfaceInStream这个,可也不行,不知道是不是使用的方法不对。这个问题怎么解决?
nodiebirdcomeback 2010-11-06
  • 打赏
  • 举报
回复
SwitchToThread函数没有真正实现强迫当前线程放弃其时间片,
这就是说SwitchToThread后面的代码是有一定几率可以被执行的。
几率有多大这个跟操作系统运行的当时环境有关的。
nodiebirdcomeback 2010-11-06
  • 打赏
  • 举报
回复
还有SwitchToThread是有副作用的,有可能导致没过你设置的时间就直接执行不该执行的代码哦
我觉得还使用WaiForXXXXX解决最好
nodiebirdcomeback 2010-11-06
  • 打赏
  • 举报
回复
楼上的你的代码可靠吗?

函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。

汪宁宇 2010-11-06
  • 打赏
  • 举报
回复
看看这个吧,用线程实现定时器:
#define TIMER_LEN     10000

DWORD WINAPI TimerThread(LPARAM pamaram)
{
UINT oldTickCount, newTickCount;
oldTickCount = GetTickCount();
while(TRUE)
{
while(TRUE)
{
newTickCount = GetTickCount();
if(newTickCount - oldTickCount >= TIMER_LEN)
{
oldTickCount = newTickCount;
break;
}
else
SwitchToThread();
}
// Call your function
}
return 0;
}
nodiebirdcomeback 2010-11-06
  • 打赏
  • 举报
回复
到目前为止Windows系统没有一个是实时操作系统,所以在算法消耗时间随机的情况下,
使用任何形式的定时器(Timer和等待定时器)都是徒劳的。进程之间彼此通信的方法很多的,
可以使用"告诉"对方的方式来构建程序,这才是解决进程彼此需要对方通信的最佳方案。
sd6814466 2010-11-05
  • 打赏
  • 举报
回复
定时器2在将要加载的COM组件里?可以理解为和COM组件绑在一起了么?

若是如此,我的想法是主程序加载COM组件时不直接加载,而是创建线程,在创建的线程内再加载COM组件,两个定时器就算是分开了
周江涛 2010-11-05
  • 打赏
  • 举报
回复
楼上的没经过大脑,楼主的意思是线程定时调用COM组件的功能,当然得在COM外解决.

创建线程,Sleep(5000)后,调用COM组件功能,用到的资源保证做过线程安全,和普通的多线程编程一样.

ouyh12345 2010-11-05
  • 打赏
  • 举报
回复
com里的东西,在com里解决

15,471

社区成员

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

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