Ошибка ASSERT после удаления моего класса qt в отдельном потоке - PullRequest
1 голос
/ 21 ноября 2011

Если у меня есть класс FunctionsClass, который наследует QObject и содержит QTcpServer и QTcpClient в качестве переменных-членов.В моем основном UI-классе я установил переменную-член FunctionsClass для Qthread с именем FunctionClassThread, выполнив:

FunctionsClass *classObj = new FunctionsClass // (classObj is a class member)
classObj->moveToThread( &FunctionClassThread );
FunctionClassThread.start();

// connected some signal/slots..
// do some stuff...

Затем я деконструировал объект, содержащий мой экземпляр FunctionsClass, выполнив:

FunctionClassThread.quit();
FunctionClassThread.wait();
delete classObj; // problem line...........

Эта ошибка возникает, только когда classObj's QTcpServer в данный момент прослушивает или QTcpSocket пытается подключиться к серверу, а я удаляю classObj.Ошибка: сбой ASSERT в QCoreApplication :: sendEvent: "Невозможно отправить события объектам, принадлежащим другому потоку. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

После перемещения classObj в другой поток, вы больше не можете удалять его из потока, в котором вы его создали. Вы должны либо удалить его в вашем FunctionsClassThread, либо переместить его обратно в основной поток с помощью кода который обрабатывается в пределах FunctionsClassThread.

Прочитайте документы Qt в moveToThread () :

Эта функция может только «вытолкнуть» объект из текущего потока в другой поток, он не может «вытянуть» объект из любого произвольного потока в текущий поток.

Так что перед тем, как ваш FunctionsClassThread собирается остановиться, он должен вызвать

classObj->moveToThread( QApplication::thread() );

Конечно, ваш FunctionsClassThread должен знать об объекте либо напрямую, либо с помощью сигналов и слотов

0 голосов
/ 21 ноября 2011

A QObject имеет сродство к потоку. Он любит манипулировать только тем потоком, в котором он был создан. Используйте QMetaObject :: invokeMethod , чтобы вызвать метод в контексте другого потока

...