Russian Qt Forum
Ноябрь 22, 2024, 18:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал из главного потока  (Прочитано 3363 раз)
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 должен уметь "сказать" им вызвать определенные функции и даже передать данные. Спасибо.
Записан
BlackTass
Гость
« Ответ #1 : Ноябрь 05, 2010, 02:04 »

Объект threadserver принадлежит главному потоку, следовательно его слоты выполняются в главном потоке. Вам нужно либо поменять аффинити вашего инстанса threadserver, либо добавить еще один класс, объект которого также будет создаваться в дочернем потоке и который уже и будет всем рулить.
Записан
Ultra
Гость
« Ответ #2 : Ноябрь 05, 2010, 16:04 »

То есть вместо того, что бы создавать новый класс наследник от QThread, нужно создать класс наследник от QObject, определить там все нужные слоты/сигналы и функции и просто перенести его в поток? Я щас попробовал создать класс-объект, вроде бы выполняется в нужном потоке, но доступа к server нету, попробую делать все телодвижения в объекте. Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 21.