while-Schleife und GUI gleichzeitig zum laufen bringen
-
Hallo,
ich sitze hier vor einer Anwendung und stehe gerade ein wenig auf dem Schlauch. Folgendes Szenario:
Ich habe 2 in Qt Programmierte GUI's, die sich über Mico Corba "unterhalten" sollen, d.h. wenn ich bei Anwendung A einen Button betätige, soll bei Anwendung B etwas passieren.
Das Problem ist nun folgendes, dass in Anwendung B eine ständige while-Schleife laufen muss, die darauf wartet ob von A etwas kommt.
Wenn ich diese Methode allerdings vor der Anwendung starte, wirde diese natürlich nicht mehr angezeigt. Andererseits kann ich nach dem Anzeigen von B, also nach app.exec(), hinschreiben was ich will, es wird nicht ausgeführt.
Gibt es irgendeine Möglichkeit, wie ich diese Schleife laufen lassen kann, ohen dabei den rest meines Programmes zu blockieren? Man muss dazu sagen, dass ich noch nicht so wirklich der C++-Crack bin

Schonmal danke für die Antworten.
MfG
-
Die Lösung in einem Wort: Threads oder Timer.
Ansatz A (Threads):
Am Anfang von Programm B startest du einen zweiten Thread, der deine while-Schleife enthält. Der kann dann nebenher weiterlaufen, während der Hauptthread die GUI anzeigt und auf Eingaben reagiert. Wenn im Zweitthread etwas passiert, informiert er den GUI-Thread darüber und der gibt die Informationen an den User weiter.Ansatz B (Timer):
Du startest am Anfang einen Timer mit einer Laufzeit von wenigen Millisekunden. Und in der zugehöhrigen OnTimer-Verarbeitung fragst du dann, ob am Eingang etwas passiert ist:void OnTimer() { if(data_avaiable())//hierher kommt die Wartebedingung deiner Schleife process_data(); }
-
Danke für die schnelle Antwort.
Leider weiss ich bei beiden Vorschlägen jetzt gerade absolut nicht, wie ich da anfangen muesste. Ich hab zwar ein ganz gutes Buch, wo auch Threads beschrieben werden, allerdings kann ich die Beispiele dort nicht auf mein Programm übertragen.
Programm B sieht grob gesagt folgendermaßen aus:
Anwendung::Anwendung(QStackedWidget *parent) : QStackedWidget(parent) { createSeite1(); createSeite2(); addWidget(Seite1); addWidget(Seite2); }Gestartet wird dann folgendermaßen:
main.cpp:
int main( int argc, char ** argv ) { QApplication app( argc, argv ); Anwendung *unit = new Anwendung(); unit->setGeometry(500, 500, 480, 640); Anwendung::setWidgetBackgroundColor(unit, Qt::black); /* Es wird eine Verbindung zur Datenbank hergestellt */ if (!unit->createConnection()) { return 1; } /* Sichtbarmachen des Fensters */ unit->show(); /* Ausführen des gesamten Programmes */ return app.exec(); }Das Problem ist die Methode getButtons, die ungefähr so aussieht:
short Anwendung::getButton(Button button) { while (1) { if ( ButtonsQueue->ReceiveEntry(button)) { printf("Empfange Taste %d \n",button); } usleep(10); } return(button); }Wie gesagt hab ich jetzt leider überhaupt keine Ahnung wie ich dieses Gerüst jetzt in Threads umsetzten kann. Vielleicht hat ja noch jemand einen kleinen Tipp o.ä. parat.
MfG
-
qt bietet für sich wiederholende aufgaben ne timer klasse an http://doc.trolltech.com/4.3/qtimer.html
die kümmert sich im hintergrund darum, dass threads angeschubst werden usw.
-
Hallo,
also, ich habe jetzt versucht das ganze mit einem Timer zu realisieren, und es läuft auch schon einigermaßen, alledings ist noch ein Fehler drin, den ich nicht finde.
Ich rufe in meinem Konstruktor die Methode getButton() auf, welche folgendermaßen aussieht:
void DisplayUnit::getButton() { timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(100); }Der Slot update() ist so implementiert:
void DisplayUnit::update() { if ( m_CDUPushedButtonsQueue->ReceiveEntry(Button)) { switch (m_CDUPushedButtonsQueue->ReceiveEntry(Button)) { case 0: slotPage1(); printf("Empfange Taste %d \n",Button); break; case 1: slotPage2(); printf("Empfange Taste %d \n",Button); break; } } }Jetzt habe ich noch folgende Probleme:
-
Egal welcher Button in Anwendung A gedrückt wird, es wird immer der slotPage1 ausgeführt, auch wenn z.B. der Button 15 gedrückt wird.
-
Obwohl die Ausgabe bei Anwendung A sagt, dass Button x gesendet wurde, als Ausgabe von B erscheint immer die Zahl 4223872, die ich mir überhaupt nicht erklären kann
-
Der slotPage2 wird nie ausgeführt, d.h. sobald ich bei Anwendung A irgendeinen Button drücke spring Anwendung B wie gewünscht zur Page2, wenn ich dann wieder Button 1 o.ä drücke passiert gar nichts.
Ich hab mit den Code jetzt 10 Mal durchgelesen, aber ich komme irgendwie nicht auf den Fehler.
EDIT: Füge ich in der update() vor der switch-Anweisung die Zeile ein
cout << Button << endl;
wird komischerweise noch die richtige zahl ausgegeben, der Fehler muss also irgendwo in der switch-Anweisung liegen

EDIT2: PROBLEM GELÖST, mit switch(Button) anstelle von switch(m_CDUPushedButtonsQueue->ReceiveEntry(Button)) funktioniert es wie gewünscht
MfG
-