• 11391阅读
  • 15回复

[求职]怎么使用windows的多媒体定时器。 [复制链接]

上一主题 下一主题
离线zhsj
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-15
我加入了头文件Mmsystem.h 并且在pro中加入了...LIBS += -lWinmm.lib,还缺少什么?等都完成后,怎么将它slot链接?还是根本不用这个...学习Qt不久,谢谢大家~
离线dbzhang800

只看该作者 1楼 发表于: 2011-04-15
引用楼主zhsj于2011-04-15 18:25发表的 怎么使用windows的多媒体定时器。 :
我加入了头文件Mmsystem.h 并且在pro中加入了...LIBS += -lWinmm.lib,还缺少什么?等都完成后,怎么将它slot链接?还是根本不用这个...学习Qt不久,谢谢大家~

1. Qt 在Windows xp(包括)以上系统已经默认使用了多媒体计时器,你确认你需要自己再实现一遍?
2. 你使用QTimer、QBasicTimer、QTimeLine 或者 QObject::startTimer() QObject::killTimer() 遇到什么具体问题?
3. 如果你确定要自己写代码调用,应该参看 MSDN
4. 当然,你也可以看Qt源码中对多媒体定时器的封装与使用部分
离线zhsj

只看该作者 2楼 发表于: 2011-04-15
回 1楼(dbzhang800) 的帖子
呵呵~又见到了哈~~

我用QTimer的时候,顺便用elapsed()来测定定时的准确性,在15ms的时候,偶然有出错的情况,但是在定义50ms的时候,出错几率大为增加。更具之前说的>20ms的时候会用到一个不精准的定时器,所以我想调用多媒体定时器来增加准确性...
离线roywillow

只看该作者 3楼 发表于: 2011-04-15
QTimer的精度没有补偿之类的似乎,所以误差可能会积累下去
感觉用QTimeLine会比较不错,设定好的话那个东西是可以无限循环下去的,跟QTimer很类似的就
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 4楼 发表于: 2011-04-15
Re:回 1楼(dbzhang800) 的帖子
引用第2楼zhsj于2011-04-15 21:21发表的 回 1楼(dbzhang800) 的帖子 :
呵呵~又见到了哈~~
我用QTimer的时候,顺便用elapsed()来测定定时的准确性,在15ms的时候,偶然有出错的情况,但是在定义50ms的时候,出错几率大为增加。更具之前说的>20ms的时候会用到一个不精准的定时器,所以我想调用多媒体定时器来增加准确性...

既然这样,看这个吧(不太完善,仅供参考)
http://blog.csdn.net/dbzhang800/archive/2011/04/15/6326856.aspx
离线zhsj

只看该作者 5楼 发表于: 2011-04-16
回 3楼(roywillow) 的帖子
QTimeline我试过...发现有帧和刷新时间两个概念...具体是怎么运作的?
离线zhsj

只看该作者 6楼 发表于: 2011-04-16
回 4楼(dbzhang800) 的帖子
感动~~谢谢!!

但是....我试了下...发现没有slot没有被相应....
MMTimer mtr(10,this);
    connect(&mtr,SIGNAL(timeout()),this,SLOT(nout()));


我在定义的另一个类中用了上述的代码来连接,不知道有没有错...

MMTimer::MMTimer(int interval, QObject *parent) :
    QObject(parent),m_interval(interval),m_id(0)
}

这个后边的m_interval(interval),m_id(0)是不是意味着...m_interval=interval?并且是定时的值?额...好吧...还有很多要学
[ 此帖被zhsj在2011-04-16 22:08重新编辑 ]
离线dbzhang800

只看该作者 7楼 发表于: 2011-04-16
Re:回 4楼(dbzhang800) 的帖子
引用第6楼zhsj于2011-04-16 22:01发表的 回 4楼(dbzhang800) 的帖子 :
感动~~谢谢!!
但是....我试了下...发现没有slot没有被相应....
MMTimer mtr(10,this);
    connect(&mtr,SIGNAL(timeout()),this,SLOT(nout()));
.......

如果你真是在构造函数中这么写的,那么你肯定出错了。即使是QTimer,你这么用也不会工作 ^_^
离线zhsj

只看该作者 8楼 发表于: 2011-04-16
回 7楼(dbzhang800) 的帖子
那个...我在后边加了mtr.start();而且编译通过了...QTimer我成功的额...那么...究竟怎么写呢?顺便再问下怎么设定定时间隔?
void MMTimer::start()
{
    m_id = timeSetEvent(m_interval, 1, mmtimer_proc, (DWORD_PTR)this,
                 TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);

}
可以这么改吗?
离线dbzhang800

只看该作者 9楼 发表于: 2011-04-16
建议,补充一些C++的基础知识吧.

1. 你似乎不了解 C++ 构造函数的初始化列表?

2. 你真的在构造函数中试过下面的代码,而且没有问题????
QTimer mtr(this);
    connect(&mtr,SIGNAL(timeout()),this,SLOT(nout()));
mtr.start(10);
离线zhsj

只看该作者 10楼 发表于: 2011-04-16
回 9楼(dbzhang800) 的帖子
太好了~还在...辛苦!刚刚看了初始化列表,学习了~那个程序放在下面的...
t0::t0(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::t0)
{
    ui->setupUi(this);
    MMTimer mtr(10,this);
    connect(&mtr,SIGNAL(timeout()),this,SLOT(nout()));
    mtr.start();



}
可以运行,但是slot没有被调用...
[ 此帖被zhsj在2011-04-16 23:41重新编辑 ]
离线dbzhang800

只看该作者 11楼 发表于: 2011-04-17
Re:回 9楼(dbzhang800) 的帖子
引用第10楼zhsj于2011-04-16 23:27发表的 回 9楼(dbzhang800) 的帖子 :
太好了~还在...辛苦!刚刚看了初始化列表,学习了~那个程序放在下面的...
t0::t0(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::t0)
{
.......


1. 其实我前面已经提到了,你的用法不对。
2. 你用QTimer,这样用肯定是同样的效果。如果你的QTimer可以工作,说明你的QTimer不是这么用的!

3. 建议:找本C或C++的书,熟悉变量的作用域,变量的生存周期,heap和stack 等东西
离线zhsj

只看该作者 12楼 发表于: 2011-04-17
回 11楼(dbzhang800) 的帖子
QTimer *tint = new QTimer(this);
connect(tint, SIGNAL(timeout()), this, SLOT(nout()));
tint->start(50);
上边是我QTimer的用法...额...所以我就仿照那个用了...那么mmtimer应该怎么用呢?
当然在main里还有这些:
QApplication a(argc, argv);
    t0 w;
    w.show();
    return a.exec();
我不知道为什么错了...非常抱歉...打搅你了...
[ 此帖被zhsj在2011-04-17 12:19重新编辑 ]
离线dbzhang800

只看该作者 13楼 发表于: 2011-04-17
Re:回 11楼(dbzhang800) 的帖子
引用第12楼zhsj于2011-04-17 12:04发表的 回 11楼(dbzhang800) 的帖子 :
QTimer *tint = new QTimer(this);
connect(tint, SIGNAL(timeout()), this, SLOT(nout()));
tint->start(50);
上边是我QTimer的用法...额...所以我就仿照那个用了...那么mmtimer应该怎么用呢?

呵呵,

找本C++的书,分清
QTimer *tint = new QTimer(this);
QTimer tint(this);
的区别再继续吧
离线zhsj

只看该作者 14楼 发表于: 2011-04-17
回 13楼(dbzhang800) 的帖子
不好意思,刚刚离开了....第一个是调用把动态的地址给tint并且用QTimer::QTimer..后者是QTimer::QTimer tint?

我修改了下代码  MMTimer *mtr=new MMTimer(10,0)就好了~~
谢谢啦!
[ 此帖被zhsj在2011-04-17 15:25重新编辑 ]
离线huzhiwen28

只看该作者 15楼 发表于: 2011-04-18
多媒体定时器很好用,我在提高window内部定时器精度的时候,就使用了1ms间隔的多媒体定时器,这样在
while(1)
{
work();
msleep(1);
}

的时候,msleep(1)就休眠了大概2ms,大大的提高的任务的调度精度(如果不用多媒体定时器,内部调度精度大概为10ms)
http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
快速回复
限100 字节
 
上一个 下一个