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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSocketNotifier ASSERT Error  (Прочитано 2361 раз)
alexandros
Гость
« : Июнь 30, 2013, 19:41 »

Есть серверное приложение, хочу к нему добавить возможность изменение настроек/конфигураций "на лету" то есть без рестарта, с консоли вводятся команды на которые сервер сразу же реагирует.

Код
C++ (Qt)
#include <QtCore/QCoreApplication>
 
#include "threadio.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   int port = SettingsStorage::getInstance()->getValue("core/port").toInt();
   int maxclients = SettingsStorage::getInstance()->getValue("core/maxclients").toInt();
   int maxthreads = SettingsStorage::getInstance()->getValue("core/maxthreads").toInt();
 
   CoreServer *coreServer = new CoreServer();
 
   coreServer->setMaxPendingConnections(maxclients);
   coreServer->initDaemon(port);
 
   QThreadPool::globalInstance()->setMaxThreadCount(maxthreads);
   ...
   return a.exec();
}
 

 /*
        Вариант 1 (не работает)
       
        блокирует работу приложения, сервер не принимает запросы

        while(std::getline(std::cin,command)){

        }
    */

    /*
    Вариант 2
 
    ThreadIO *tio = new ThreadIO();
    tio->setCoreServer(coreServer);
    tio->start(); // тут и содержится while(std::getline(std::cin,command)){...}
    ссылка на объект сервера была через синглтон

    НО!!!

    вываливается следующее:

    QSocketNotifier: socket notifiers cannot be enabled from another thread
    (типа невозможно управлять объектом из другого потока)
   
   
    */

как быть?
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Июль 01, 2013, 10:23 »

Транслировать команды, полученные внутри ThreadIO основному потоку (тому, в котором CoreServer создан) через сигнал/слоты. Т.е. в ThreadIO добавить сигнал commandReady(QString command), а в CoreServer соответствующий слот, и всю обработку команд делать непосредственно в CoreServer.
Записан
alexandros
Гость
« Ответ #2 : Июль 01, 2013, 21:03 »

В общем делается так:

Код
C++ (Qt)
signals:
   void execCommandEvent(QString action, QStringList args);
public slots:
   void execCommandSlot(QString action, QStringList args);
 

Код
C++ (Qt)
void ThreadIO::run()
{
   std::string command = "";
   QStringList qcommand = QStringList();
 
   while(std::getline(std::cin,command)){
       qcommand = QString(command.c_str()).split(QChar(' '));
 
       QString action = qcommand[0];
       qcommand.removeAt(0);
 
       emit CoreServer::getInstance()->execCommandEvent(action,qcommand);
   }
}
 

Код
C++ (Qt)
void CoreServer::execCommandSlot(QString action,QStringList args)
{
   if(action == "shutdown"){
 
   }else if(action == "reboot"){
 
   }else{
 
   }
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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