Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ну и куда дели getch() ?? как сделать функциональный аналог 
:(
    Опции темы
yaja
  Дата 3.10.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Всем привет... smile
Сталь необходимо не в консольной программе создать некоторый аналог dos'ого getch'а или kbhit'а
Т.е. хотелось, чтобы у пользователя была возможность "остановиться и прочитать" что ему пишут в STATIC или EDIT окошке...
Например, во время выполнения цикла стало необходимо известить пользователя о том, что молоко убежало и после того, как он на это прореагирует (нажмет на любую клавишу), продолжить работу...
Аля имессагеБокс выскочил, и пользователь нажал на заветную кнопочку Хорошо, но только он не выскочил на самом деле... smile



PM MAIL   Вверх
Earnest
Дата 3.10.2005, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Если MessageBox вызвать, то он выскочит, никуда не денется... (если, конечно, твой цикл не в рабочем потоке). Раз не выскочил - значит неправильно вызываешь.
getch как в консольных приложениях ... ну можно, скажем, нарисовать цикл выборки сообщений (GetMessage или PeekMessage) и не выходить, пока WM_KEYDOWN не придет. Но это самый тупой способ, сойдет только если у тебя одно окно в котором один статик на все приложение. Но тогда, спрашивается, чего тебе в консоли не живется? Или только на время отладки алгоритма.


--------------------
...
PM   Вверх
yaja
Дата 3.10.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



C WM_KEYDOWN не подойдет, слишком уж это не эффективо, да и плюс хотелось, чтобы нажатие на enter и ему подобных тоже считалось реакцией пользователя... У меня была идея с таким циклом, но подходящих типов сообшений я не нашел...
PM MAIL   Вверх
Earnest
Дата 3.10.2005, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



В каком смысле WM_KEYDOWN неэффективно? ENTER тоже должно попадать в WM_KEYDOWN, как и все прочие клавиши. Еще раз, объясни, зачем тебе это нужно. Если только для отладки - одно, если должно жить в работающем приложении, то совсем по-другому делать надо, чтобы все трудилось без глюков.



--------------------
...
PM   Вверх
yaja
Дата 4.10.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(Earnest @ 3.10.2005, 21:06)
В каком смысле WM_KEYDOWN неэффективно?

Плохо выразился, не WM_KEYDOWN плох, а GetMessage, поскольку может поток отправить поспать, что долго по времени. Хотя эти издержки полная чушь в моей задаче, так что я погорячился, когда написал это.

Цитата(Earnest @ 3.10.2005, 21:06)
ENTER тоже должно попадать в WM_KEYDOWN, как и все прочие клавиши.

Я думал, что если нажать на ENTER и ему подобные, не нажимая никаких других клавишь, то WM_KEYDOWN не проидет. Видимо я ошибся smile
Цитата(Earnest @ 3.10.2005, 21:06)
Если только для отладки - одно, если должно жить в работающем приложении, то совсем по-другому делать надо, чтобы все трудилось без глюков.

Мне это нужно для нормальной работы приложения.
PM MAIL   Вверх
Earnest
Дата 4.10.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Ну, чтобы не спать, можно использовать вместо GetMessage PeekMessage.
Но, как я уже говорила, если ты хочешь, чтобы остальные сообщения обрабатывались нормально, пока ты ждешь клавишу, придется полную обработку сообщений в этом цикле писать: все эти TranslateMessage, DispatchMessage, и т.д., все, что у тебя там есть.

В общем, нормальных способов 2 и ни один из них не похож на getch():

1) разбиваешь цикл на итерации (т.е. то, что выполняется между 2мя нажатиями). Т.е. у тебя должна быть функция или объект, который за один вызов выполняет одну итерацию. (Объект лучше, потому что придется хранить промежуточные параметры цикла). В управляющем окне просто ставишь обработчик WM_KEYDOWN. Поймал - выполнил итерацию. Если надо, чтобы проталкивание происходило независимо от того, находится ли управляющее окно в фокусе, придется вставлять фильтр в главный цикл обработки сообщений (типа MFC-шного PreTranslateMessage).

2) цикл не разбиваешь, но переносишь в рабочий поток. Создаешь event (с автосбросом), которое проверяешь в начале каждой итерации (или не каждой, по необходимости). Управляющее окно (или фильтр PretranslateMessage) остаются, конечно, в главном потоке. Там все то же самое, только вместо вызова метода объекта, взводится event.

Второй способ лучше тем, что во-первых, не разбивается код обработки (цикла), во-вторых, не возникает проблем с реакцией приложения даже если итерации выполняются заметное время. Но он требует хорошей проработки механизма синхронизации + если из обработки нужно что-нибудь рисовать или как-то иначе общаться с окнами, тоже требуются дополнительные прокладки.

В обоих случаях не мешало бы подумать, как пользователь узнает, что пора нажимать кнопку.



--------------------
...
PM   Вверх
yaja
Дата 6.10.2005, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Ну 2-ой способ слишком сложен для моей задачи, а первый вполне подойдет... smile Спасибо тебе
Earnest единственному и неповторимому, не заленившемуся дать начинающему совет. Товарищи, троекратное ура ему. smile и плюсик тоже можно smile
Полагаю, что тема закрыта smile
PM MAIL   Вверх
yaja
Дата 8.10.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



ЗЫ
нашел функцию MsgWaitForMultipleObjects которая идеально решила поставленную задачу.
Это так, на будующее smile
PM MAIL   Вверх
Earnest
Дата 8.10.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да, но:
1) пока ты сидишь в MsgWaitFor... поток стоит и все остальные сообщения (кроме тех которые ловишь) не обрабатываются (прорисовка там, etc)
2) функция хороша, если тебе надо ждать какие-нибудь объекты ядра, и при этом реагированть на сообщения. Ты какие объекты ядра ждешь? Никакие? Тогда цикл GetMessage дает абсолютно то же самое. Резюме: микроскопом гвозди...


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.9138 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.