Russian Qt Forum

Qt => Общие вопросы => Тема начата: Примерный ученик от Март 18, 2011, 16:04



Название: Вопрос по консольной программе(не решено)
Отправлено: Примерный ученик от Март 18, 2011, 16:04
QT3.3.8

Консольная программа без цикла событий.
В цикле выполняются некие действия...
Завершаться должна при вводе команды
Код:
exit
с консоли...
Как быть? ???


Название: Re: Вопрос по консольной программе
Отправлено: Примерный ученик от Март 18, 2011, 16:14
Уточняю вопрос:
можно ли узнать, что в stdin появилась информация?
Чтобы только тогда вызвать
Код:
streamIN.readLine();


Название: Re: Вопрос по консольной программе
Отправлено: Fess от Март 18, 2011, 18:55
ИМХО, лучше выделить полезный рабочий код в отдельный поток, к интерфейс к нему (пусть консольный - это будет уже не важно) управляет процессом как ему нужно.


Название: Re: Вопрос по консольной программе
Отправлено: Примерный ученик от Март 18, 2011, 20:17
В stdout выводится результат работы...
Если сделать отдельный поток - те же проблемы будут...
Мне просто надо знать, когда во входном потоке появляется команда и ее прочитать ???


Название: Re: Вопрос по консольной программе
Отправлено: brankovic от Март 18, 2011, 21:28
QT3.3.8

Консольная программа без цикла событий.
В цикле выполняются некие действия...
Завершаться должна при вводе команды
Код:
exit
с консоли...
Как быть? ???

Странно поставлена задача. Если завершаться должна после вычислений, то может сначала посчитать, вывести результат, а потом читать stdin? Или принципиально важно остановить по команде exit?


Название: Re: Вопрос по консольной программе
Отправлено: Примерный ученик от Март 19, 2011, 10:50
Ничего странного...
В цикле выполняется длительная работа с выдачей результата в stdout...
Завершение работы или после выполнения всего задания или по команде оператора.
Вот и хочу узнать: был ли ввод в stdin >:(


Название: Re: Вопрос по консольной программе
Отправлено: Примерный ученик от Март 19, 2011, 11:11
В общем, все очень просто
Код:
	QFile in;
        QTextStream streamIN(&in);
in.open(IO_ReadOnly,stdin);

Код:
	if (!in.atEnd())
{
serverCommand = streamIN.readLine();
QString serCom = serverCommand.upper();
                 if (serCom == "EXIT")  break;
}
Рассматриваем входной поток как файл и следим за его концом ;D


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: Примерный ученик от Март 19, 2011, 11:40
Не прокатывет...
Всегда не конец файла ???

Точнее при вызове
Код:
(in.atEnd())
процесс останавливается до появления информации в stdin ??? ??? ???


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: m_ax от Март 19, 2011, 12:54
Может проще сделать как-то так:
Код
C++ (Qt)
std::string msg;
std::string quitCommand = "Exit";
while (true) {
       std::getline(std::cin, msg);
       if (msg == quitCommand) {
           quit();
           return 0;
       }
       sendEvent(msg);
   }
 
Или опишите проблему более детально, а то так очень смутно представляется что вы хотите..
Я сейчас тож пишу одно консольное приложение просто..


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: Примерный ученик от Март 19, 2011, 13:15
m_ax
В цикле идет опрос серверов и в stdout выводится информация об опросе.
Заканчивается работа по команде с консоли exit.
Проблема в том, что команда readln переводит приложение в режим ожидания и прекращает работу основной функции :-[


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: m_ax от Март 19, 2011, 13:39
m_ax
В цикле идет опрос серверов и в stdout выводится информация об опросе.
Заканчивается работа по команде с консоли exit.
Проблема в том, что команда readln переводит приложение в режим ожидания и прекращает работу основной функции :-[
Фактически моя задача очень похожа на вашу. У меня есть ядро, которое занимается вычислениями (очень долгими и нудными), но я могу с консоли не прирывая вычисления вводить команды, например, для вывода статуса, остановки вычислений, перезапуска и ещё кучу всяких команд.
Ядро просто запускается в отдельном потоке, тогда readln не буде блокировать ядро.
Могу показать исходники самого механизма, реализующего само консольное приложения и механизм общения через консоль с объектами. 


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: Igors от Март 19, 2011, 14:11
На Линуксе я работал "аж несколько раз" поэтому возможно вариант ниже наивен. Как я понял, надо узнать нажата ли клавиша не входя в ожидание. Я делал так

Код
C++ (Qt)
int ReadyKey( void )
{
   int i;
   fd_set fds;
   struct timeval tv;
   FD_ZERO(&fds);
   FD_SET(STDIN_FILENO, &fds);
   tv.tv_sec = tv.tv_usec = 0;
   i = select(1, &fds, NULL, NULL, &tv);
   if (i == -1) return false;
 
   return FD_ISSET(STDIN_FILENO, &fds) != 0;
}
 
// использование
if (ReadyKey() && getchar() == 27)  // нажал Cancel?
 


Название: Re: Вопрос по консольной программе(не решено)
Отправлено: Примерный ученик от Март 19, 2011, 14:13
m_ax
Спасибо.
Я не хочу создавать еще один поток.
Этот поток и сам в конечном итоге будет управляться извне (идет отладка)...
Применю в качестве команды на окончание просто убиение потока
(он грузится через QProcess и ничего никуда, кроме stdout не пишет)