Toepassing-> Procesberichten in QT?

In Borland 6 gebruik ik dit vaak om programma-actie ongedaan te maken:

Application->Processmessages();

Nu, met QT 4.8.1, heb ik in deze buitenlandse (voor mij) documentatie van QT niet gevonden.

Kan iemand mij helpen?

3

1 antwoord

In Qt zou u de statische functie QApplication :: processEvents() gebruiken.

Helaas, uw probleem is dat het ontwerp van uw code is verbroken. U hoeft nooit processEvents te bellen om dingen eenvoudigweg "los te maken". Al uw GUI-code moet bestaan ​​uit run-to-completion-methoden die een korte tijd in beslag nemen (in de orde van enkele milliseconden: ~ 0.001s). Als iets langer duurt, moet u het opsplitsen in kleinere secties en de controle terugsturen naar de gebeurtenislus na het verwerken van elke sectie.

Hier is een voorbeeld:

class Worker: public QObject
{
  Q_OBJECT
  int longWorkCounter;
  QTimer workTimer;
public:
  Worker() : ... longWorkCounter(0) ... {
    connect(workTimer, SIGNAL(timeout()), SLOT(longWork());
  }
public slots:
  void startLongWork() {
    if (! longWorkCounter) {
      workTimer.start(0);
    }
  }
private slots:
  void longWork() {
    if (longWorkCounter++ < longWorkCount) {
     //do a piece of work
    } else {
      longWorkCounter = 0;
      workTimer.stop();
    }
  }
};

Een zero-duration timer is één manier om je code te laten bellen telkens wanneer de event-wachtrij leeg is.

Als u bibliotheekcode van derden aan het blokkeren bent, is de enige (ongelukkige) oplossing het plaatsen van die bewerkingen in sleuven in een QObject en dat QObject naar een werkthread verplaatsen.

4
toegevoegd
Ditzelfde advies zou ook van toepassing zijn op de Borland 6-code. Elke code die de UI-thread langer dan enkele (milli) seconden blokkeert, moet worden herschreven om een ​​asynchrone wachtrij of werkthread te gebruiken.
toegevoegd de auteur Remy Lebeau, de bron