linux c++ periodische timer callback

Ich versuche zu schreiben ein einfaches Programm, das in seiner main-loop ruft verschiedene Funktionen auf der Grundlage der Benutzereingabe (hier kein problem) und auch einige Aktionen auf seine eigene - das sind Zeit basiert.
Da ich vermeiden möchte mögliche Daten-access-Probleme (ich bin nicht gut im multithreading) ich habe versucht, um Rückrufe zu gewährleisten, verschiedene autonome Teile des Programms aufgerufen werden würde jeder so-und-so Millisekunden.

Von dem, was ich gefunden habe, boost::asio-sieht aus wie der Weg zu gehen - allerdings weiß ich nicht, was ist der richtige Ansatz hier. Ich habe einen einfachen code, der funktioniert:

#include <iostream>

#include <boost/asio.hpp>//scheduling
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;

void clb(const boost::system::error_code&){
    // eye.procFrame(&img, true);
    cout << "callback ok" << endl;
}
int main() {
    bool run = true;
    int i =0;

    while(run){
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(2));
        t.async_wait(clb);
        io.run();
        if(++i>10) run = false;
    }
    cout << "done, i=" << i;
    return 0;
}

Mein wichtigstes Anliegen ist es, die Erklärungen - wenn ich verschieben Sie Sie außerhalb der while-Schleife, wird der Rückruf erfolgt nur einmal. Gibt es eine Möglichkeit zu schreiben, Rückrufe zu ähneln timer-interrupts vom mikrocontroller?

Schlafen ist keine Lösung - es würde machen das Programm nicht mehr reagiert und würde nicht garantieren, dass Teile des Programms sind aktualisiert, nach Ihrem Zeitplan (z.B. GUI aktualisieren jeden 25ms, aber das aufnehmen sollte auftreten, nur 10 mal in der Sekunde[100ms Zeit) als eine schwere operation unter eine Menge von Ressourcen]

Vielleicht gibt es einen völlig anderen Ansatz, der besser wäre? Ich dachte, mehr threads, aber ich fürchte, wenn ich versuchen und Faden jedes Stück Programm werde ich am Ende mit einer Schüssel spaghetti, ich würde nie in der Lage sein zu verwalten, auf lange Sicht.

Deine überlegungen sind richtig, Sie müssen diese von einem separaten thread aus. Ich verstehe nicht, warum das dazu führen sollte, dass spaghetti-code.
Da ich mehrere Teile, die aufgerufen werden müssen in verschiedenen Intervallen, die ich brauchen würde, einen thread für jede Methode. Dann würde ich brauchen, um sicherzustellen, dass Sie nicht in eine race-condition oder einem deadlock. EDIT: Außerdem, ist das nicht ein performance-Problem wenn ich spawn sagen wir 5-10 threads?
Sie müssen nur ein thread pro timer, und könnte umhüllter in t ist eine eigene Klasse. Ich fürchte, du hast mich falsch.
Also der thread laufen würde, den Teil des Codes habe ich in die while-Schleife? Dann wird jeder - wenn timer verantwortlich für den besonderen Teil des code abläuft - nennen würde, der Rückruf? Ich werde es wohl neu schreiben müssen Teil der Schnittstelle (ich habe ncurses)
'So, der thread laufen würde, den Teil des Codes habe ich in die while-Schleife?' Mehr oder weniger, denke ich. Man könnte sogar ein einfaches sleep() im timer-thread-Funktion.

InformationsquelleAutor user3002166 | 2014-03-20

Schreibe einen Kommentar