Как предотвратить PyQt объекты от сбора мусора из другого потока? - PullRequest
4 голосов
/ 20 октября 2010

Я использую Qt 4.7 и PyQt 4.7 для сборки многопоточной программы с графическим интерфейсом.Я тщательно управлял объектами PyQt, чтобы они оставались в одном потоке пользовательского интерфейса, чтобы избежать проблем с синхронизацией, и в целом проблем нет.

Но иногда, в данный момент сборщик мусора python активируется из другого потока,деструктор объекта Qt вызывается прямо здесь, и следующее утверждение не выполняется изнутри Qt.

Я могу определить QT_NO_DEBUG даже для отладочной версии, и это должно быть хорошо, потому что собираемые объекты едва ли вызывают проблему синхронизации.Но, тем не менее, я не думаю, что это хорошая идея, чтобы отключить другие сообщения отладки.Как я могу предотвратить это?

#if !defined (QT_NO_DEBUG) || defined (QT_MAC_FRAMEWORK_BUILD)
void QCoreApplicationPrivate::checkReceiverThread(QObject *receiver)
{
    QThread *currentThread = QThread::currentThread();
    QThread *thr = receiver->thread();
    Q_ASSERT_X(currentThread == thr || !thr,
               "QCoreApplication::sendEvent",
               QString::fromLatin1("Cannot send events to objects owned by a different thread. "
                                   "Current thread %1. Receiver '%2' (of type '%3') was created in thread %4")
               .arg(QString::number((quintptr) currentThread, 16))
               .arg(receiver->objectName())
               .arg(QLatin1String(receiver->metaObject()->className()))
               .arg(QString::number((quintptr) thr, 16))
               .toLocal8Bit().data());
    Q_UNUSED(currentThread);
    Q_UNUSED(thr);
}
#elif defined(Q_OS_SYMBIAN) && defined (QT_NO_DEBUG) 

Ответы [ 2 ]

5 голосов
/ 15 августа 2011

Эта проблема появилась в списке рассылки PyQt в потоке

"небольшая ошибка в PyQt в сочетании с сборщиком мусора Python" http://www.riverbankcomputing.com/pipermail/pyqt/2011-August/030376.html

Ковид Гоял предложил обходной путь вhttp://www.riverbankcomputing.com/pipermail/pyqt/2011-August/030378.html

где он написал:

В качестве обходного пути в своих проектах я отключаю автоматический сборщик мусора и запускаю сборку мусора вручную в потоке графического интерфейса через QTimer.

Он разместил там пример кода.

0 голосов
/ 09 ноября 2010

Я бы порекомендовал использовать pyqtSignal.Вы можете создавать сигналы для потоков, которые будут отправляться, когда их задача будет выполнена, и получатель станет функцией подключения сигнала.

...