Название: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 11:02 Помогите ??? Выдается ошибка - хочу написать сервер и чтобы он начинал работать по нажатию кнопки, при этом вынес сервер в отдельный поток.
Код: QObject: Cannot create children for a parent that is in a different thread. MyServer.CCP Код MyServer.H Код
Название: Re: Работа с сетью Отправлено: blood_shadow от Апрель 22, 2011, 11:53 ты сервер переместил в другой поток:
Код слот slotNewConnection() вызывается в главном потоке, потому вся проблема в ф-ции m_ptcpServer->nextPendingConnection(); она создает QTcpSocket как потомок твоего m_ptcpServer, но пытается его создать в главном потоке, идею улавливаешь? нельзя создавать потомка и родителя в разных потоках, о чем тебе и сказали: Код: QObject: Cannot create children for a parent that is in a different thread. Название: Re: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 12:04 ???А почему он вызвается в главном потоке, когда я создаю его в конструкторе потока MyServerThread ???
Что мне нужно сделать??? Название: Re: Работа с сетью Отправлено: blood_shadow от Апрель 22, 2011, 12:33 ???А почему он вызвается в главном потоке, когда я создаю его в конструкторе потока MyServerThread ??? MyServerThread - создается в главном потоке, это только обертка для потока, другой поток на самом деле Что мне нужно сделать??? имеет место только в run(), то есть объект MyServerThread живет в основном потоке и слот slotNewConnection() вызывается для объекта с основного потока если чесно я неоч понимаю что надо делать, но можно сделать вот что: сравни указатели this в MyServerThread и MyServerThread->thread(), если они разные то поменяешь m_ptcpServer->moveToThread(this->thread()) и connect(m_ptcpServer, SIGNAL(newConnection()), this->thread(), SLOT(slotNewConnection())); Название: Re: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 12:42 :)Сча попробую
Название: Re: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 12:46 Попробовал
QObject: Cannot create children for a parent that is in a different thread. (Parent is QTcpServer(0x8e0f880), parent's thread is QThread(0x8d96838), current thread is MyServerThread(0x8de1180) :( ??? Название: Re: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 12:49 Наверное надо делать как в Fortune Server Thread примерах Qt ???
создать отдельно Окно(Qwidget),Server(QTcpServer) и ServerThread(QThread) - 3 объета ??? ??? Название: Re: Работа с сетью Отправлено: kuzulis от Апрель 22, 2011, 13:04 Код
Только вместо QTcpServer можно (нужно) сделать свой класс типа MyServer: public QTcpServer в котором реализовать слот slotReadClient . Код
И создавать в ::run() не QTcpServer , а MyServer. Как то так, думаю идея ясна. Название: Re: Работа с сетью Отправлено: mutineer от Апрель 22, 2011, 13:09 2 kuzulis
Ну и где-то еще удалять m_ptcpServer Название: Re: Работа с сетью Отправлено: kuzulis от Апрель 22, 2011, 13:10 Ну да, естественно.
Название: Re: Работа с сетью Отправлено: blood_shadow от Апрель 22, 2011, 13:19 у меня появилась еще идея:
Код
Код
Идея такова pendingSocket == 0(по умолчанию) waitCondition(QWaitCondition) усыпляет вторичный поток, потом когда появляется новый сокет испускается сигнал slotNewConnection() и будиться вторичный поток waitCondition.wakeOne(); далее во втор. потоке мы получаем наш новый сокет nextPendingConnection(); доступ к переменной защищаем с помощью мьютекса Название: Re: Работа с сетью Отправлено: demaker от Апрель 22, 2011, 13:39 :)Попробуем
Название: Re: Работа с сетью Отправлено: demaker от Апрель 25, 2011, 10:57 Спасибо,заработало :)
А вот почему надо создавать было дочерний объет???Подскажите :) Название: Re: Работа с сетью Отправлено: blood_shadow от Апрель 25, 2011, 14:43 Спасибо,заработало :) потому что, объект созданный в ф-ции run создается в дочерном потоке, а сам же объект А вот почему надо создавать было дочерний объет???Подскажите :) MyServerThread создается в родительском и потому все ф-ции(слоты) вызываются в родительском потоке для твоего MyServerThread тут почитай - http://habrahabr.ru/blogs/qt_software/115830/ две части |