Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTService + QThread + QTCPServer, отправка ответа клиентам 
V
    Опции темы
Filin88
Дата 16.4.2014, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Здравствуйте!

Есть сервис с несколькими рабочими потоками. Хотел, чтобы TCP-сервер принимал входящие соединения в отдельном потоке. Однако при коннекта клиента к серверу вызывается слот "NewConnection" в потоке кутэсервиса, а не в отдельном потоке TCP-сервера, что делает невозможным отправить ответ клиенту. 

Код TCP-сервера
Код

void TCP_Server_thd::run()
{    
    m_ptcpServer = new QTcpServer(); 
    if (!m_ptcpServer->listen(QHostAddress::Any, 8888))
    {
        m_ptcpServer->close();
        return;
    }
    
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));

    exec();

    delete m_ptcpServer;

    m_ptcpServer = NULL;
}

void TCP_Server_thd::slotNewConnection(void)
{
    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();

    connect(pClientSocket, SIGNAL(disconnected()),  pClientSocket, SLOT(deleteLater()));
    connect(pClientSocket, SIGNAL(readyRead()), this,    SLOT(slotReadClient()) );

    sendToClient(pClientSocket, "Server Response: Connected!");
}


void TCP_Server_thd::sendToClient(QTcpSocket* pSocket, const QString& str)
{
    int i = 0;
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_2);
    out << str;

    pSocket->write(arrBlock);                                        <<<------- Проблема здесь

}


Код

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x15f1c88), parent's thread is TCP_Server_thd(0x37e7b8), current thread is QThread(0x377b00)



Пробовал разные варианты создания сервера, но все равно вызов идет из кутэсервиса. Хотелось бы сделать отдельный поток, так как кол-во клиентов заранее неизвестно, но будет только увеличиваться. Но я смотрю, что от потока кутэсервиса никуда не деться. Можно ли это вообще разрулить?



PM MAIL   Вверх
bsa
Дата 16.4.2014, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Filin88, добавь в начало TCP_Server_thd::run(): moveToThread(this);
PM   Вверх
Filin88
Дата 16.4.2014, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Цитата(bsa @ 16.4.2014,  11:26)
Filin88, добавь в начало TCP_Server_thd::run(): moveToThread(this);

Добавил. теперь функция выглядит так:
Код

void TCP_Server_thd::run()
{    

    moveToThread(this);

    m_ptcpServer = new QTcpServer(); 
    if (!m_ptcpServer->listen(QHostAddress::Any, 8888))
    {
        m_ptcpServer->close();
        return;
    }
    
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));

    exec();

    delete m_ptcpServer;

    m_ptcpServer = NULL;
}


Теперь на строчке "moveToThread(this);" Output выдает:
Код

QObject::moveToThread: Cannot move objects with a parent


PM MAIL   Вверх
Guinness
Дата 16.4.2014, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Filin88 @  16.4.2014,  13:31 Найти цитируемый пост)
Теперь на строчке "moveToThread(this);" Output выдает:

Попробуй не указывать parent`а для QThread, передавай null.
PM MAIL   Вверх
Filin88
Дата 16.4.2014, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.4.2008

Репутация: нет
Всего: нет



Заработало! Вот как выглядит рабочий вариант:

Сервис запускает рабочий цикл и сервер
Код

void Service::start()
{
    QCoreApplication *app = application();

    //Замкнутая задача
    opros = new opros_thd(app);
    opros->start();

    //Запуск TCP-сервера
    opros->TCP_Server = new TCP_Server_thd(NULL);
    opros->TCP_Server->moveToThread(opros->TCP_Server);
    opros->TCP_Server->start();
}


Код сервера:
Код

void TCP_Server_thd::run()
{    
    m_ptcpServer = new QTcpServer(); 
    if (!m_ptcpServer->listen(QHostAddress::Any, 8888))
    {
        m_ptcpServer->close();
        return;
    }
    
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));

    exec();

    delete m_ptcpServer;

    m_ptcpServer = NULL;
}


Guinness, bsa спасибо!


Это сообщение отредактировал(а) Filin88 - 16.4.2014, 13:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.