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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не срабатывает слот incomingConnection() после переноса обмена в доп. поток  (Прочитано 4071 раз)
Маус
Гость
« : Апрель 06, 2013, 08:41 »

Взял пример реализации сервер-клиент на основе QTcpSocket и QTcpServer из документации, всё прекрасно работает, решил переместить обмен в доп. поток QThread. QTcpSocket прекрасно передает запросы, всегда приходит сигнал hostFound(), иногда даже приходит сигнал connected(), но на сервере не срабатывает слот incomingConnection(). Qt 4.6.0 WinXP+WinVista.
Записан
dio
Гость
« Ответ #1 : Апрель 06, 2013, 10:24 »

Приведите пример кода, реализации сервера и клиента.
Записан
Маус
Гость
« Ответ #2 : Апрель 07, 2013, 12:53 »

Мой код полностью соответствует документации, и он работал, пока его не засунули в доп. поток. Может кто-нибудь даст ссылку на работающий пример реализации клиент-сервер в доп. потоке?
Записан
Bepec
Гость
« Ответ #3 : Апрель 07, 2013, 13:23 »

Отвечу вам...

Код полностью соответствующий документации должен работать в доп. потоке.

Покажите ваш код Улыбающийся
Записан
Маус
Гость
« Ответ #4 : Апрель 07, 2013, 19:18 »

Реализация Сервера (без .h файлов)
Код:
#include "server.h"
#include "ServerThread.h"

Server::Server(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
server = new CServerThread(this);
server->start();
}


#include "ServerThread.h"
#include "CServerTcp.h"

CServerThread::CServerThread(QObject *parent)
: QThread(parent)
{
moveToThread(this);
serverTcp = new CServerTcp(this);
}
void CServerThread::run()
{
if(!serverTcp->listen(QHostAddress::Any, 1204)) {
return;
}
while(1) {
sleep(2);
}
exec();
}



#include "CServerTcp.h"

CServerTcp::CServerTcp(QObject *parent)
: QTcpServer(parent)
{
}
void CServerTcp::incomingConnection(int socketId)
{
qDebug("New client connection!");
}

Реализация клиента
Код:
#include "client.h"
#include "ClientThread.h"

Client::Client(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
client = new CClientThread(this);
client->start();
}


#include "ClientThread.h"
#include "ClientTcp.h"

CClientThread::CClientThread(QObject *parent)
: QThread(parent)
{
moveToThread(this);
clientTcp = new CClientTcp(this);
}
void CClientThread::run()
{
clientTcp->connectToHost("192.168.0.1",1204);
if(!clientTcp->waitForConnected()) {
qDebug("connected faild");
return;
}
while(1) {
sleep(2);
}
exec();
}
Записан
Bepec
Гость
« Ответ #5 : Апрель 07, 2013, 19:42 »

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

PS попробуйте там слот сделать и вызвать его через сигнал QueuedConnection'ном.
Записан
Маус
Гость
« Ответ #6 : Апрель 07, 2013, 20:29 »

нашел про цикл событий (на стороне клиента):
http://www.prog.org.ru/topic_21076_0.html
но у меня в функции run() (и на сервере и у клиента) уже есть цикл по общему буферу с двумя семафорами. Как тогда объединить эти два бесконечных цикла?
Записан
Маус
Гость
« Ответ #7 : Апрель 07, 2013, 20:52 »

QEventLoop помог.
IncomingConnection() наконец-то стал запускаться на сервере.
Теперь осталось скрестить ужа и ежа (зачеркнуто) два цикла, засуну ка я в цикл событий цикл по буферу с семафорами;-)
Записан
Bepec
Гость
« Ответ #8 : Апрель 08, 2013, 15:45 »

Событийный поток сделайте.

Аля
Код:
void run()
{
    //чё то делаете, соединяете слоты и прочая
    exec(); // запускаете цикл событий потока :D
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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