Russian Qt Forum

Qt => Общие вопросы => Тема начата: mcrads от Март 02, 2010, 17:24



Название: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 17:24
Всем доброго времени суток. Снова с замудренными вопросами ) Пишу консольное приложение на Qt. и собстно проблема:
1) есть ли в Qt средства ввода/вывода в консоли помимо stdio.h и iostream?
2) почему после команд return a.exec(); a.exit; мое приложение еще работает? командная строка висит, правда ничего не принимает.


Название: Re: Консольное приложение
Отправлено: Пантер от Март 02, 2010, 17:39
1. QTextStream
2. return 0;


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 17:42
1. QTextStream
2. return 0;
ЭЭЭ а QIODevice какое задавать?
Можно пример ввода в консоль на qt? или объясните как пользоваться...


Название: Re: Консольное приложение
Отправлено: Silentium от Март 02, 2010, 17:54
Код:
#include <QTextStream>
....
QTextStream in(stdin),out(stdout);
out<<"что то вводим"<<endl;
out.flash; //обязательно сбрасываем
in>>an>>endl; //что то вводим
Этот пример гдето лежал на этом форуме


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 17:55
Благодарю! помогло! =)


Название: Re: Консольное приложение
Отправлено: Amigo_sa от Март 02, 2010, 18:06
Всем доброго времени суток. Снова с замудренными вопросами ) Пишу консольное приложение на Qt. и собстно проблема:
2) почему после команд return a.exec(); a.exit; мое приложение еще работает? командная строка висит, правда ничего не принимает.
Про exit-ы и quit-ы меня недавно поправляли (http://www.prog.org.ru/index.php?topic=12578.msg80098#msg80098), то есть цикл обработки прилоений уже прервался, но main, либо вызывающая функция еще не завершилась.


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 18:18
И все же. как тогда запустить цикл событий? если не exec'ом? запускаю exec - прога не выходит. не запускаю - цикла то нет. или все будет и без него? я пишу Tcp сервак.


Название: Re: Консольное приложение
Отправлено: Amigo_sa от Март 02, 2010, 18:29
Хм. кажется понял, в чем у вас проблема...
return a.exec();
a.exit(); - до exit-а управление никогда не доходит.

Мой код, где так же был ТCP сервак:
Код:
QCoreApplication a(argc, argv);
QSharedPointer<ILog> applLog(ILog::create("TerminalManagerServer"));
CommandServer server(applLog);

    if (!server.listen(QHostAddress::Any, 5700))
    {
        exit(2);
    }

    if (!sender.initialize())
    {
        exit(1);
    }

    return a.exec();
для корректного выхода из приложения есть слот, в котором написано QApplication::exit(0); как вариант, можно написать обработчик нажатия cntrl+C


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 19:06
хм... странно... даже есть написать
a.exit(0);
return a.exec()
все равно ноль эффекта =(


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 19:09
хм... странно... даже есть написать
a.exit(0);
return a.exec()
все равно ноль эффекта =(
А что тебя удивляет?


Название: Re: Консольное приложение
Отправлено: lit-uriy от Март 02, 2010, 19:11
Sickfar, если запущен цикл обработки событий, то нужно выходить через слот quit(), соедени с ним сигнал какой-нибудь (означающий завершение работы).
Когда управление вернётся в цикл обработки событий, то цикл прекратится, т.е. закончит выполнятся функция QCoreApplication::exec()


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 19:14
А вообще без него можно обходиться?


Название: Re: Консольное приложение
Отправлено: lit-uriy от Март 02, 2010, 19:16
>>А вообще без него можно обходиться?
можно, если ты не используешь события и взаимодействие между потоками


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 21:48
не понимаю почему не работает... жесть какая-то... exec подвешивает все. без него - не крутятся события, не работают сигнал-слоты.. почему?


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 21:53
не понимаю почему не работает... жесть какая-то... exec подвешивает все. без него - не крутятся события, не работают сигнал-слоты.. почему?
exec запускает цикл обработки событий. Если его не запустить, то события обрабатываться не будут, асинхронные сигналы работать не будут.
Если это все тебе не нужно - не запускай, и наоборот.
Ты лучше напиши, что ты хочешь сделать.  ;)


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 22:17
Ну собственно вот... естественно сигнал нового соединения у TCP сервера не проходит =((( не пойму как быть... помогите пожалуйста! чую без exec не обойтись... но как его впихнуть? в консольном приложении я так понял нельзя определить keyPressEvent =((( - в этом тоже крупная проблема... Помогите пожалуйста!

PS Меня еще расстраивает что в доках нет примера по консолькам =((


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 22:33
Ну собственно вот... естественно сигнал нового соединения у TCP сервера не проходит =((( не пойму как быть... помогите пожалуйста! чую без exec не обойтись... но как его впихнуть? в консольном приложении я так понял нельзя определить keyPressEvent =((( - в этом тоже крупная проблема... Помогите пожалуйста!
Так что программа должна делать?
Например, если это какой-то сервер, то можно создать объект и запустить цикл обработки событий.
Этот объект, будет слушать порт, обслуживать подключения, принимать/отправлять данные. Если придет команда EXIT, то он вызовет quit и приложение завершиться.

Код
C++ (Qt)
int main(int argc, char *argv[])
{
QCoreApplication app( argc, argv );
 
VFServer server;
QObject::connect( &server, SIGNAL( finished() ), &app, SLOT( quit() ) ); // Когда объект server пошлет сигнал finished, завершить eventloop
 
return app.exec();
}
 

Ты подробней напиши...


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 22:38
Ну это собственно сервак (клиентская часть пока не реализована...). он должен принимать клиентов и обслуживать их, а так же читать команды из консоли... так вот получается такая ерунда, что если не пускать exec - события не крутятся, это очевидно. запустить exec - значит писать обработчик событий. тогда как написать обработчик событий для ввода команд, если QKeyEvent лежит в модуле QtGui который в консольке отключен?


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 22:49
он должен принимать клиентов и обслуживать их, а так же читать команды из консоли...
Ну так открывай stdio, подключай сигнал readyRead, и читай то что ввел пользователь в консоли:
Код
C++ (Qt)
QFile file;
file.open( stdio, QIODevice::ReadOnly );
connect( &file, SIGNAL( readyRead() ), SLOT( readUserCommand() );
 

Причем здесь QtGui? Причем здесь QKeyEvent?


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 23:07
на stdio ругается что не объявлено... на stdin - никакой реакции совершенно =(((

Дело в том что при включенном exec консоль вообще никак не реагирует на клаву. ввод как заблокирован. все что тыкаю - на экране не отображается и значит до системы не доходит... =(

Гуи здесь ни при чем, это я так, посетовал... я наверное вообще затупил... но блин, от этого решения зависит моя работа, а я с консолями еще не работал =(


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 23:15
Дело в том что при включенном exec консоль вообще никак не реагирует на клаву. ввод как заблокирован. все что тыкаю - на экране не отображается и значит до системы не доходит... =(
Венда?


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 23:17
она самая. под юнихом нормально будет?


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 23:22
под юнихом нормально будет?
Нормально.
Насчет консоли в венде, подожди может кто знающий ответит. Там скорее всего свои заморочки...

UP: Кстати, если нужен такой интерактивный сервер, почему не использовать GUI. Можно сделать красивое окошко, в котором будет выводиться вся важная информация (количество подключенных клиентов, трафик, логи, ...), а так же будет строка, в которой можно вводить команды.


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 23:24
все-таки stdio или stdin? в файле открывать? на  stdio ругается..


Название: Re: Консольное приложение
Отправлено: BRE от Март 02, 2010, 23:27
все-таки stdio или stdin? в файле открывать? на  stdio ругается..
Конечно stdin, stdio это опечатка.  :)


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 23:43
Код:
<Сие конструктор>
    file.open(stdin, QIODevice::ReadOnly);
    connect(&file, SIGNAL(readyRead()), this, SLOT(getCommand()));
<>
void VFServer::getCommand()
{
    QTextStream stre(&file);
    QString serverCommand;
    serverCommand = stre.readLine();
    QString command = serverCommand.toUpper();
    if (command == "EXIT")
    {
        emit finished();
        return;
    }
    runCommand(command);
}

скомпилил под маком - символы вводить можно, но увы все равно не работает ((( ррр!


Название: Re: Консольное приложение
Отправлено: mcrads от Март 02, 2010, 23:50
UP: Кстати, если нужен такой интерактивный сервер, почему не использовать GUI. Можно сделать красивое окошко, в котором будет выводиться вся важная информация (количество подключенных клиентов, трафик, логи, ...), а так же будет строка, в которой можно вводить команды.


Задание такое - консоль. с гуем то все понятно... =(


Название: Re: Консольное приложение
Отправлено: BRE от Март 03, 2010, 07:09
Код
C++ (Qt)
#include <QCoreApplication>
#include <QFile>
#include <QSocketNotifier>
#include <QDebug>
 
class StdinReader : public QObject
{
       Q_OBJECT
public:
       StdinReader();
 
public slots:
       void    readCommand();
 
private:
       QFile                   m_stdin;
       QSocketNotifier *m_notifier;
};
 
StdinReader::StdinReader()
{
       if( !m_stdin.open( stdin, QIODevice::ReadOnly ) )
       {
               qDebug() << "Error attach stdin";
               return;
       }
 
       m_notifier = new QSocketNotifier( m_stdin.handle(), QSocketNotifier::Read, this );
       connect( m_notifier, SIGNAL( activated( int ) ), SLOT( readCommand() ) );
}
 
void StdinReader::readCommand()
{
       QByteArray str = m_stdin.readLine();
       qDebug() << "Data:" << str;
 
}
 
int main( int argc, char *argv[] )
{
       QCoreApplication app( argc, argv );
 
       StdinReader reader;
 
       return app.exec();
}
 
#include "main.moc"
 


Название: Re: Консольное приложение
Отправлено: mcrads от Март 03, 2010, 09:19
Спасибо! разобрался!!! отличный простенький пример! только жаль в винде все равно не работает =(