Frage

Ich benutze QT 4.7.0 (32 Bit) an Windows 7 Ultimate (32 Bit) Maschine. Ich habe QT wahrscheinlich von Version 4.0 oder 4.2 verwendet und fast alle verwendet 4.xy Veröffentlichungen.

Vor kurzem habe ich mit QT 4.7 Probleme.

Ich habe eine Multithread -Anwendung in einer älteren Version von QT geschrieben. Ich habe die Version vergessen, aber wahrscheinlich die letzte Version, in der ich ordnungsgemäß zusammengestellt und gelaufen bin, ist 4.5.x oder 4.6.x. Das Gewinde Der Teil scheint in 4.7 nicht richtig zu funktionieren, oder ich habe etwas missverstanden. Hier ist das Problem:

Der Hauptfaden beginnt thinker Faden. Im Folgenden ist das run() Die Funktion von thinker Faden:

void ThinkerThread::run()
{
    _threads_running = NSUBTHINKERS;

    // ...
    _sub_thinker[0].start();

    // ...    
    _sub_thinker[1].start();

    exec();
}

Das _sub_thinker's finished() Signal ist miteinander verbunden mit ThinkerThread::subThinkerFinished() Slot für alle _sub_thinkers. Wenn alles _sub_thinkers beenden, ThinkerThread::subThinkerFinished() Anrufe quit().

Es gibt einen anderen Ort, an dem quit() wird genannt:

void ThinkerThread::tryKill()
{
    for (int i = 0; i < NSUBTHINKERS; i++)
        _sub_thinker[i].tryKill();
    quit();
}

Aus dem Haupt -Thread ist die Ausführung wie folgt wie folgt:

  • Denker.trykill () [Anmerkung: Auf sehr Faustlauf lief der Denker nicht.
  • Denker.start ()

thinker's finished() Signal ist miteinander verbunden mit autoMove().

Für alle früheren Versionen von QT, autoMove() wurde danach gerufen thinker::quit() wird genannt ThinkerThread::subThinkerFinished(). In 4.7 sehe ich das autoMove() wird nach dem allerersten Anruf von genannt thinker.tryKill(), obwohl der Thread nicht lief.

Irgendeine Idee?

Natürlich kann ich im Inneren überprüfen ThinkerThread::tryKill() wenn thinker läuft oder nicht. Aber ich würde gerne wissen, warum das passiert.

Vielen Dank.

War es hilfreich?

Lösung

Ich habe das gefunden QThread::finished() wird jedes Mal emittiert QThread::quit() wird unabhängig vom Zustand von als QThread (dh laufend/nicht laufen). Es war nicht der Fall für frühere Versionen von QT.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top