Ich habe 3 Prozesse: A
, B
und Final
. Final
hängt sowohl von A
als auch B
ab und kann/muss nur aktualisiert werden, wenn sowohl A
als auch aktualisiert werden. Es gibt ein Signal dataChanged
, das sowohl A
als auch B
(und so auch Final
) aktualisiert. Die Steckplätze update_A
und update_B
werden auch von anderen Signalen aufgerufen.Qt - Steckplatz nur aufrufen, wenn beide Signale ausgegeben werden
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent),
pA(false),
pB(false)
{
...
connect(this, &MainWindow::xChanged, this, &MainWindow::update_A);
connect(this, &MainWindow::yChanged, this, &MainWindow::update_B);
connect(myObj, &MyClass::dataChanged, this, &MainWindow::update_A);
connect(myObj, &MyClass::dataChanged, this, &MainWindow::update_B);
connect(this, &MainWindow::a_Updated, this, &MainWindow::update_final);
connect(this, &MainWindow::b_Updated, this, &MainWindow::update_final);
...
}
void MainWindow::update_A() {
if (!this.pA) {
// do something
}
this.pA = true;
emit a_Updated;
}
void MainWindow::update_B() {
if (!this.pB) {
// do something
}
this.pB = true;
emit b_Updated;
}
void MainWindow::update_final() {
if (this.pA && this.pB) {
// do something
this.pA = false;
this.pB = false;
}
}
Gibt es trotzdem, um die Signale mit der AND-Operator zu kombinieren pA
und pB
loszuwerden verwenden? Oder habe ich Signale und Slots falsch verwendet?
EDIT: Entschuldigung, dass ich vergessen habe zu erwähnen: update_A
und update_B
werden auch von anderen Signalen aufgerufen, so dass ich sie als getrennte Steckplätze behalten muss. Und ich habe die Frage und den Code oben aktualisiert.
sind update_A und update_B blockiert? Sind alle Objekte in einem Thread? Da Slots in der Reihenfolge aufgerufen werden, in der sie verbunden waren, wird update_B immer aufgerufen, sobald update_A beendet ist. Wenn Sie den finalen Slot mit dataChanged nach den anderen 2 Connects verbinden, wird der Slot aufgerufen, sobald update_B beendet ist. –
Warum benutzen Sie nicht einen einzelnen Slot, der diese Funktionen aufruft (die wiederum 'bool' zurückgeben können, um den Status zu überprüfen) Rufen Sie 'Finish' auf, wenn alle Funktionen erfolgreich sind? – ramtheconqueror
Da die Steckplätze auch mit anderen Signalen verbunden sind, kann ich sie nicht kombinieren. 'dataChanged' ist nur ein Signal, das beides aufruft. Es gibt Signale, die nur einen der Slots aufrufen, aber sobald beide Slots aufgerufen sind, muss auch der 'update_final' aufgerufen werden. – scmg