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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по консольной программе(не решено)  (Прочитано 5418 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« : Март 18, 2011, 16:04 »

QT3.3.8

Консольная программа без цикла событий.
В цикле выполняются некие действия...
Завершаться должна при вводе команды
Код:
exit
с консоли...
Как быть? Непонимающий
« Последнее редактирование: Март 19, 2011, 11:39 от Примерный ученик » Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #1 : Март 18, 2011, 16:14 »

Уточняю вопрос:
можно ли узнать, что в stdin появилась информация?
Чтобы только тогда вызвать
Код:
streamIN.readLine();
Записан

Как мало времени и как много нужно узнать
Fess
Гость
« Ответ #2 : Март 18, 2011, 18:55 »

ИМХО, лучше выделить полезный рабочий код в отдельный поток, к интерфейс к нему (пусть консольный - это будет уже не важно) управляет процессом как ему нужно.
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #3 : Март 18, 2011, 20:17 »

В stdout выводится результат работы...
Если сделать отдельный поток - те же проблемы будут...
Мне просто надо знать, когда во входном потоке появляется команда и ее прочитать Непонимающий
Записан

Как мало времени и как много нужно узнать
brankovic
Гость
« Ответ #4 : Март 18, 2011, 21:28 »

QT3.3.8

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

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

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #5 : Март 19, 2011, 10:50 »

Ничего странного...
В цикле выполняется длительная работа с выдачей результата в stdout...
Завершение работы или после выполнения всего задания или по команде оператора.
Вот и хочу узнать: был ли ввод в stdin Злой
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #6 : Март 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;
}
Рассматриваем входной поток как файл и следим за его концом Смеющийся
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Март 19, 2011, 11:40 »

Не прокатывет...
Всегда не конец файла Непонимающий

Точнее при вызове
Код:
(in.atEnd())
процесс останавливается до появления информации в stdin Непонимающий Непонимающий Непонимающий
« Последнее редактирование: Март 19, 2011, 11:59 от Примерный ученик » Записан

Как мало времени и как много нужно узнать
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Март 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);
   }
 
Или опишите проблему более детально, а то так очень смутно представляется что вы хотите..
Я сейчас тож пишу одно консольное приложение просто..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #9 : Март 19, 2011, 13:15 »

m_ax
В цикле идет опрос серверов и в stdout выводится информация об опросе.
Заканчивается работа по команде с консоли exit.
Проблема в том, что команда readln переводит приложение в режим ожидания и прекращает работу основной функции Обеспокоенный
Записан

Как мало времени и как много нужно узнать
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Март 19, 2011, 13:39 »

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 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?
 
« Последнее редактирование: Март 19, 2011, 14:14 от Igors » Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #12 : Март 19, 2011, 14:13 »

m_ax
Спасибо.
Я не хочу создавать еще один поток.
Этот поток и сам в конечном итоге будет управляться извне (идет отладка)...
Применю в качестве команды на окончание просто убиение потока
(он грузится через QProcess и ничего никуда, кроме stdout не пишет)
Записан

Как мало времени и как много нужно узнать
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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