Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объектно-ориентированный ncurses 
:(
    Опции темы
zmaximka
Дата 28.8.2012, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте. Я решил написать небольшую игру на C++ с использованием ncurses. Я использую объектно-ориентированный подход, но поскольку ncurses написан на С я хочу написать класс "обвертку" который будет инкапсилировать нуженые мне функции из ncurses. Инициализацию и деинециализацию ncurses можно делать в конструкторе и деструкторе класса. Но я соверщенно не могу придумать обработку нажатия клавиш. В процедурной программе нажатие клавиши я обрабатываю в цикле: 

Код

while((char)(ch = getch()) != 'q')
{
...
switch(ch)
{
...
}
...
}


Подскажите пожалуйста, как можно инкапсулировать обработку нажатия клавиш c помощью ncurses?
PM MAIL ICQ   Вверх
boostcoder
Дата 28.8.2012, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



виртуальным методом.

PM WWW   Вверх
zmaximka
Дата 28.8.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @ 28.8.2012,  10:14)
виртуальным методом.

Расскажите пожалуйста по подробнее. Как можно инкапсулировать бесконечный цикл? 
PM MAIL ICQ   Вверх
boostcoder
Дата 28.8.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Код

struct base {
   virtual void on_key(int ch) {
      дефолтная реализация
   }
};


struct window: base {
   virtual void on_key(int ch) {
      переопределенная реализация
   }
};


PM WWW   Вверх
zmaximka
Дата 28.8.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @ 28.8.2012,  19:05)
Код

struct base {
   virtual void on_key(int ch) {
      дефолтная реализация
   }
};


struct window: base {
   virtual void on_key(int ch) {
      переопределенная реализация
   }
};

Да, я представляю что такое виртуальный метод. Но мне кажется или я вас или вы меня неправильно понимаете. Немного погуглив, я понял что мой вопрос больше относиться к событийно-ориентированному программированию. В идеале хотелось бы что-то на подобие MFC, но как я понял в UNIX-подобных системах понятие события отсутствует. И мой вопрос как раз, какими возможностями можно написать цикл обработки события нажатия кнопки инкапсулированное в классе c использованием ncurses. 

PS: Еще мне кажется что я усложняю. Возможно есть более простые решения данной проблемы?
PM MAIL ICQ   Вверх
boostcoder
Дата 28.8.2012, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



вот теперь понятней.

тут два варианта:
1. в отдельном потоке запустить цикл читающий клаву.
2. реализовать очередь событий, и чтоб она помимо прочего, еще и постоянно читала состояние клавы.

по поводу первого - просто в реализации, но создаст множество проблем в будущем, ибо придется из другого потока звать обработчик нажатия.

PM WWW   Вверх
zmaximka
Дата 28.8.2012, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо. Тогда подскажите пожалуйста, как можно организовать очередь событий в UNIX-подобных системах. А вообще было бы здорово если посоветовали книжку где можно почитать об этом.
PM MAIL ICQ   Вверх
boostcoder
Дата 28.8.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(zmaximka @  28.8.2012,  22:54 Найти цитируемый пост)
как можно организовать очередь событий в UNIX-подобных системах

очередь событий не зависит от системы. это обычно std::list<> хранящий указатели на базовый тип, в то время как сами объекты на которые указывают указатели - реализации конкретных задач.

Цитата(zmaximka @  28.8.2012,  22:54 Найти цитируемый пост)
книжку где можно почитать об этом

я хз. я в книжках это не читал.
самая простая(на мой взгляд) реализация событийной модели реализована в FLTK.
PM WWW   Вверх
zmaximka
Дата 29.8.2012, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @  28.8.2012,  23:20 Найти цитируемый пост)
самая простая(на мой взгляд) реализация событийной модели реализована в FLTK. 

Мне бы все таки хотелось самому реализовать очередь событий. На сколько я понял очередь событий можно организовать с помощью сигналов. Но мне не понятно как же заставить срабатывать обработчик сигнала по нажатию на клавишу.
PM MAIL ICQ   Вверх
boostcoder
Дата 29.8.2012, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(zmaximka @  29.8.2012,  01:34 Найти цитируемый пост)
Мне бы все таки хотелось самому реализовать очередь событий.

ну дак дерзай. я тебе дал ссылку на простую реализацию чтоб ты мог подсмотреть.

Цитата(zmaximka @  29.8.2012,  01:34 Найти цитируемый пост)
очередь событий можно организовать с помощью сигналов

о каких сигналах идет речь? unix-сигналы?

Цитата(zmaximka @  29.8.2012,  01:34 Найти цитируемый пост)
как же заставить срабатывать обработчик сигнала по нажатию на клавишу

клаву нужно опрашивать.
PM WWW   Вверх
zmaximka
Дата 29.8.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @  29.8.2012,  09:21 Найти цитируемый пост)
ну дак дерзай. я тебе дал ссылку на простую реализацию чтоб ты мог подсмотреть.

Кажется я утонул в коде. Эта простая реализация пока еще не для моего уровня. smile 
Цитата(boostcoder @  29.8.2012,  09:21 Найти цитируемый пост)
о каких сигналах идет речь? unix-сигналы?

Да
PM MAIL ICQ   Вверх
boostcoder
Дата 29.8.2012, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(zmaximka @  29.8.2012,  14:25 Найти цитируемый пост)
утонул в коде

смотри реализацию Fl::run()
'Fl' - пространство имен, не класс.

Цитата(zmaximka @  29.8.2012,  14:25 Найти цитируемый пост)
Да 

ну я тут хз. никогда не использовал.

PM WWW   Вверх
xvr
Дата 29.8.2012, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(zmaximka @  29.8.2012,  01:34 Найти цитируемый пост)
На сколько я понял очередь событий можно организовать с помощью сигналов.

Нет. UNIX сигналы не имеют никакого отношения с клавиатуре

Цитата(zmaximka @  29.8.2012,  01:34 Найти цитируемый пост)
Но мне не понятно как же заставить срабатывать обработчик сигнала по нажатию на клавишу. 

Цикл чтения и обработки клавиатуры у вас останется в любом виде (и в OOP и в не-OOP). Но в OOP случае он будет спрятан внутри ваших оберток, и наружу будут торчать только обработчики клавиш (точнее они будут торчать вверх ногами - извне вашей библиотеки внутрь её  smile )

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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