Symulacja czujnika realtime, przesyłanie danych

0

Cześć!

Potrzebuję zrobić wątek, który będzie symulował pomiary czujnika.
Pomiary mam zapisane w pliku, lecz muszę je przetwarzać z taką samą prędkością z jaką były pobierane.
Próbkowanie 2Msamp/s, zapis w blokach po 1000samp.

Wyjaśnie dokładnie to na takim przykładzie:

// wątek
QVector<int> dataBlock;
for(;;){
  wczytaj_1000sampli(dataBlock);
  wyslij(dataBlock);
  usleep(1.0e6 * 1000 / 2.0e6);
}

Funkcja "wyslij" przesyła dane do pewnego urządzenia, który analizuje ile przesyłanych jest do niego danych i musi wynosić to 1Msamp/s.
Usleep nie spełnia wymagań, nie jest brany pod uwagę czas wczytania danych oraz wysłania, więc próbkowanie które "widzi" urządzenie, jest zawsze niższe niż 1Msamp/s.

Jak to zrobić, żeby jak najbardziej zbliżyć się do symulacji w czasie rzeczywistym?
Oczywiście wielkość bloków skoryguję, tak aby czasy pomiędzy wysyłaniem były możliwe do realizacji przez PC.

QTimer na wątku, zda egzamin? Jeśli czas wykonywania event'u nie będzie dłuższy niż interwał timera, będę miał zapewnione wymagane próbkowanie?
Czy jest coś lepszego?

Aplikacja na system Linux, środowisko QT (c++).

0

Zrobiłem mały test QTimera:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTimer * timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
    timer->setInterval(1000);
    timer->setTimerType(Qt::PreciseTimer);
    timer->start();
}

void MainWindow::timeout(){
    qDebug() << "";
    qDebug() << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");
    for(int i=0; i<200e6; ++i)
        asm("nop");
    qDebug() << QDateTime::currentDateTime().toString("HH:mm:ss.zzz");
}

MainWindow::~MainWindow()
{
    delete ui;
}

Wynik:

"21:19:37.011"
"21:19:37.357"

"21:19:38.011"
"21:19:38.368"

"21:19:39.011"
"21:19:39.385"

"21:19:40.011"
"21:19:40.393"

"21:19:41.011"
"21:19:41.412"

Wygląda to bardzo dobrze, robić to na QTimerze czy coś lepszego polecacie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1