Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Ultra от Ноябрь 05, 2010, 01:29



Название: Сигнал из главного потока
Отправлено: Ultra от Ноябрь 05, 2010, 01:29
Пытаюсь отправить сигнал из главного потока (ГУИ) в свой поток. Метод глубокого загугливания привел к такому коду.
В главном потоке пытаюсь определить сигнал из this и присвоить слот от своего потока

Код:
ThreadServer = new threadserver();
QObject::connect(this, SIGNAL(stopServer()), ThreadServer, SLOT(stop()));
ThreadServer->start();
При нажатие кнопки шлю сигнал
Код:
emit stopServer();
В своем потоке создал
Код:
...
public slots:
   stop();
...
И код самой функции stop();
Код:
void threadserver::stop() {
    server->close();
    emit serverStop();
}
Где сервер это наследник от QTcpServer; В итоге когда я жму кнопку "Остановить сервер" получаю ошибку, которая говорит. что севрер создан в другом потоке (хотя слот находится в этом самом потоке где создан сервер) и что править сервер нельзя. В результате приложение крашиться.
Листинг ошибки:
Код:
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. 
Current thread 3e56a8. Receiver '' (of type 'QNativeSocketEngine') was created in thread 93bdfa8",
file kernel\qcoreapplication.cpp, line 348
C:\QT\Server\debug\Server.exe завершился с кодом 3
Помогите пожалуйста разобраться с отслеживанием сигналов у разных потоков, просто я еще планировал создавать поток для отдельных QTcpSocket, и поток от QTcpServer должен уметь "сказать" им вызвать определенные функции и даже передать данные. Спасибо.


Название: Re: Сигнал из главного потока
Отправлено: BlackTass от Ноябрь 05, 2010, 02:04
Объект threadserver принадлежит главному потоку, следовательно его слоты выполняются в главном потоке. Вам нужно либо поменять аффинити вашего инстанса threadserver, либо добавить еще один класс, объект которого также будет создаваться в дочернем потоке и который уже и будет всем рулить.


Название: Re: Сигнал из главного потока
Отправлено: Ultra от Ноябрь 05, 2010, 16:04
То есть вместо того, что бы создавать новый класс наследник от QThread, нужно создать класс наследник от QObject, определить там все нужные слоты/сигналы и функции и просто перенести его в поток? Я щас попробовал создать класс-объект, вроде бы выполняется в нужном потоке, но доступа к server нету, попробую делать все телодвижения в объекте. Спасибо!