2016-06-02 10 views
0

Betrachtet ein Qt-Projekt. Ich habe verschiedene Qthreads definiert, um meine Berechnungen in TimerEvent jeder Klasse durchzuführen und die Ergebnisse in QMainWindow anzuzeigen. (! Klasse A, B und C gleich sind und nur der Inhalt printf() würde geändert werden)Sync Qthreads auf verschiedenen Endlosschleifen (QTimerEvent)

Hier ist a.h

class A : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit A(QObject *parent = 0); 
    void timerEvent(QTimerEvent *); 

private: 
    int timerId; 
}; 

und A.cpp ist:

A::A(QObject *parent) : 
    QObject(parent) 
{ 
    timerId = startTimer(1000); 
} 

void A::timerEvent(QTimerEvent *) 
{ 
    printf("A\n"); 
} 

Die main.cpp ist als folgt:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QThread thread_1, thread_2, thread_3; 

    A objA; 
    B objB; 
    C objC; 

    objA.moveToThread(&thread_1); 
    objB.moveToThread(&thread_2); 
    objC.moveToThread(&thread_3); 

    thread_1.start(); 
    thread_2.start(); 
    thread_3.start(); 

    return a.exec(); 
} 

pl Beachten Sie, dass ich das Layout meiner Klassen nicht ändern kann. Die Frage ist: Wie kann ich meine Qthreads in diesen Situationen synchronisieren? Die Ergebnisse jeder Klasse haben keine Abhängigkeiten, aber ich muss sicher sein, dass alle Ergebnisse in jeder Sekunde und in derselben Reihenfolge verfügbar sind. Zum Beispiel müssen die Ergebnisse immer als A B C B C C A B C ... Vielen Dank!

+1

Wenn Sie sequentielle Verarbeitung möchten, müssen Sie wirklich separate Threads verwenden? – TheDarkKnight

+0

"Ich möchte etwas anderes tun, aber ich kann meinen Code nicht ändern" Mit dieser Einstellung können Sie ziemlich einfach aufgeben :( –

+0

@KubaOber einige Jungs helfen, aber Jungs wie Sie nur stöhnen! Ich kann Ihre Antwort nicht verstehen. – Mogi

Antwort

1

Was Sie fragen, ist nicht möglich. Die Ausführungszeit des Codes, der in den Threads ausgeführt wird, wird variieren, da die Kerne mit dem Rest der OS geteilt werden, und es wird variieren und wie lange sie aktiv sind. Genug, dass sich die Reihenfolge ändern kann, und Sie können garantieren. Die meisten gleichzeitigen Systeme verwenden lineare Segmente für diesen Punkt, wie alle Tasks parallel verarbeiten, setzen die Ergebnisse in eine Warteschlange und wenn der parallele Abschnitt beendet ist, sortieren Sie (wie durch und ID) und verarbeiten Sie dann.

Sie können MapReduce in QtConcurrent versuchen. Oder versuchen Sie Taskabhängigkeiten, aber das wird dem System im Wesentlichen mitteilen, dass es C nach B und B nach A ausführt, was es sequenziell macht. Sie müssen darüber nachdenken, welche Ordnungsbeschränkungen Sie wollen.

0

Wenn Sie die Klassen A, B und C nicht ändern können, können Sie trotzdem eine Verwaltungsklasse erstellen, die in den Thread verschoben wird, A-, B- und C-Objekte besitzt, einen Event-Timer hat und bei Timeouts den timerEvent() funktioniert in der richtigen Reihenfolge.

Dies ist sinnvoller, da erwartet wird, dass das Ergebnis in Ordnung ist.

Wenn es sich jedoch um eine Übung zur Thread-Synchronisation handelt, sollten Sie diese Klassen in Klassen einbetten, die eine Art Synchronisierung ausführen können, wie Zustandsvariablen, die der nächsten Klasse mitteilen, dass die aktuelle Klasse beendet ist.