定时器在QT中触发

时间:2013-12-05 16:56:27

标签: qt interrupt flags

我是初级程序员 - QT对我来说是新手。

总体任务: 需要使用NI BNC2110 DAQ生成方波信号,并由QT创建者控制。我正在使用DAQmx驱动程序访问daq。因此,我可以在daq buy上设置数字输出写入它。

方法: 为了产生方波,我只需通过周期性地将0或1写入输出来切换daq上的数字输出。所以,我需要一些定期执行的触发器。我脑子里只有一件事 - 使用某种中断(我记得在编程微控制器时使用这种中断 - 当达到某个值时,时钟会触发中断)。

如果有人能给我一个如何解决这个问题的提示。 (我希望以1-10Mhz运行触发,因此至少需要微秒分辨率)

非常感谢您提前

2 个答案:

答案 0 :(得分:1)

以下是有关QTimer解决方案的一些相关信息。

在Windows上,

QTimer的分辨率约为15毫秒左右。

我认为它使用类似于GetTickCount()的内容。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx

  

GetTickCount函数的分辨率仅限于系统计时器的分辨率,通常在10毫秒到16毫秒的范围内。

http://qt-project.org/doc/qt-4.8/qtimer.html#accuracy-and-timer-resolution

  

定时器永远不会超过指定的超时值超时,并且不能保证它们以指定的确切值超时。在许多情况下,它们可能会延迟一段时间,这段时间取决于系统计时器的准确性。

     

计时器的准确性取决于底层操作系统和硬件。大多数平台支持1毫秒的分辨率,但在许多实际情况下,定时器的精度不会与此分辨率相等。

     

如果Qt无法提供所需的定时器点击次数,它将默默地丢弃一些。

答案 1 :(得分:0)

有几种方法可以做到这一点(参见计时器documentation)。 “Qt方式”将是使用QTimer,但是用户定时器事件可能稍快一些。 (尽管如我在评论中所说,你需要一种不同的方法来获得你需要的分辨率。)

假设您有DacControl对象来切换DAC。它必须是QObject,因此它可以连接到timeout()信号:

class DacControl : public QObject
{
    Q_OBJECT

public:
    DacControl() {
        timer.setInterval(0);
        connect(&timer, SIGNAL(timeout()), this, SLOT(toggleDac()));
    }

    // The timer is not running (and the DAC is not toggled) until this call
    void start() {
        timer.start();
    }

private slots:
    void toggleDac();

private:
    QTimer timer;
};

您会注意到我将定时器间隔设置为0 ms。每次运行Qt事件循环时,这将导致计时器发出timeout()信号(因此速度取决于您运行的平台,并且可能会有很大差异,具体取决于程序的其他内容这样做)。根据我的经验,我在间隔为0时比在非常小的间隔(例如,1到约20左右)中获得了更好的性能。

希望这可以帮助您开始证明设置有效,即使这无法达到您最终所需的性能。