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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как реализовать консольную командную строку в QT используя стандартные потоки ?  (Прочитано 2161 раз)
paravoz1k
Гость
« : Август 04, 2015, 20:35 »

Здравствуйте. Делаю серверное приложение для своей маленькой игры. Мог сделать его с помощью GUI и этого вопроса небыло, но вот захотелось реализовать с помощью командной строки. Т.е. окно, в которое мы вбиваем консольные команды, и получаем ответы, но этот приложение еще разумеется работает само по себе с клиентами.
Сервер простой есть конструктор сервера, в котором мы его запускаем. Создали, соединили все с помощью сигналов-слотов, и открываем отдельный поток, который собственно говоря работает с stdin и stdout.

Цитировать
gserver::gserver(int nPort) : NextBlockSize(0)
{
    //создание, соединение и прочее опустил
        logadd("server ready"); // моя функция добавления в журнал(сообщений
        thread.start();
        thread.run();
   

}

В потоке примерно следующее вызывается

Цитировать
void ThreadIO::run()
{
    qtin = new  QTextStream(stdin);
    qtout = new  QTextStream(stdout);
    QString line;
    line = qtin->readLine();
// далее идет обработка и прочее.
}



Разумеется этот вариант - не работает нормально , т.к. работая в stdin, даже в отдельном потоке мы глушим все приложение. Поэтому, разумеется никакие запросы от клиентов, получение любых сигналов и слотов не работают здесь, и не проходят до ввода чего-либо.

Подскажите пожалуйста, как реализовать приложение такого вида. Т.е. чтобы stdin не "глушил" все. Т.е. нужно как например в gdb, и прочих других приложениях с командной строкой отдельно.
Если существует какая-то реализация не используя стандартные потоки, или что-то еще - отпишите пожалуйста, или скажите куда копать. Погуглил достаточно, и чего-то похожего не нашел. Пробывал выносить в отдельный процесс операции с stdin - получается к сожалению тоже самое.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Август 05, 2015, 18:55 »

C чего это мы  глушим приложение, работая с stdin в отдельном потоке?

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QTimer>
#include <QTime>
#include <QFile>
 
class StdInWorker : public QObject
{
   Q_OBJECT
public:
   StdInWorker() :
       mStdInStream(stdin)
   {
 
   }
   virtual ~StdInWorker() {
       qDebug() << Q_FUNC_INFO;
   }
 
   Q_INVOKABLE void startRead() {
       while (true) {
           QString data = mStdInStream.readLine();
           if (data == "quit") {
               qApp->quit();
               break;
           }
           if (data.length()){
               emit dataReceived(data);
           }
       }
   }
 
signals:
   void dataReceived(QString data);
 
private:
   QTextStream mStdInStream;
};
 
class Main : public QObject
{
   Q_OBJECT
public:
   Main() :
   mWorker(new StdInWorker)
   {
       mWorker->moveToThread(&mThread);
       mThread.start();
       connect(mWorker, SIGNAL(dataReceived(QString)),
               this, SLOT(onIncomingData(QString)), Qt::QueuedConnection);
 
   }
   virtual ~Main() {
       QMetaObject::invokeMethod(mWorker, "deleteLater", Qt::QueuedConnection);
       mThread.quit();
       mThread.wait();
 
   }
 
   void start() {
       QMetaObject::invokeMethod(mWorker, "startRead", Qt::QueuedConnection);
       QTimer *t = new QTimer(this);
       connect(t, SIGNAL(timeout()), this, SLOT(onTimeout()));
       mTime.start();
       t->start(1000);
   }
 
public slots:
   void onTimeout() {
       qDebug() << "elapsed" << mTime.elapsed();
   }
 
   void onIncomingData(QString data) {
       qDebug() << "from stdin:" << data;
   }
 
private:
   QThread mThread;
   QTime mTime;
   StdInWorker *mWorker;
};
 
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   Main m;
   m.start();
   return a.exec();
}
 
#include "main.moc"
 
 
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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