![]() |
|
Модераторы: bsa |
![]()
|
|
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
синглетон не суть, он только для удобства представления мысли.. интуитивно, так как вы до сих пор не огласили задание, наследование не очень хорошее решение.. оставляете снаружи старые грабли.. ну так видите сколько нужного Вы держали в секрете Добавлено через 3 минуты и 8 секунд тогда не пойму что мы всю тему обсуждали, если у Вас каллбяки один раз подключились и один раз отключились ?! Добавлено через 4 минуты и 41 секунду Вы уж простите меня как топик_стартер, но я выступаю за то, чтоб считать тему не законченной и ожидаю подробностей задачи. |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Как вы могли догадываться всё дело пишется на Qt. Наследование не отъемлемая часть, я наследуюсь от QApplication. 4 callback'а это функции типа: beforeSignal, afterSignal, beforeSlot, afterSlot. Это дело не документировано, но работает. То есть тут я устанавливаю фильтра вообще на все сигналы и слоты (такой стандартной возможности в Qt нет, максимум QSignalSpy, которому обязательно нужен конкретный объект и конкретный сигнал. Этим дело не ограничивается и я позарился фильтровать все события приходящие от ОС (WM_* - windows, XEvent - X11). C Windows проблем небыло, есть специальная функция, которая все разбирает и возвращает отладочную информацию в виде строки. С XEvent уже проблемка, в Qt нет нигде формирования отладочной информацией и мне пришлось брать исходники старой утилиты xev, которая написана на Cи и всё переписывать на C++/Qt. Конечная цель заключается в написании класса на базе QApplication, которая выводит 3 уровня событий: OS (WM_*, X11, Мака нет, так что не судьба), QEvent'ы, Signals and Slots. Способы все это сделать найдены после штудирования исходников Qt, осталось переписать xev с Си на C++. Если всё получится, то выложу на каком-нибудь форуме по Qt в качестве класса для отладки событий приложения, ну и в академическо-образовательных целях. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
1. Вы устанавливает свой фильтр вместо фильтра приложения.
2. Там Вы отлавливаете XEvent и в зависимости от него вызываете, я так понимаю, один из системных методов приложения. теперь где возникла проблема ? в пункте один никакого многоразового использования структуры нет, а к пункту два это структура никоим образом не относится... Добавлено через 7 минут и 5 секунд хочу также обратить внимание на то, что наследование нужно лишь для выполнения одной части работы, а и имено для подключения системы фильтрации.. Сама же обработка событий желательно должна быть описана в другом классе. |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Проблем с реализацией нет. Я изначально вопрос поставил в контексте "правильного стиля программирования". Это не совсем так. Дело в том, что qDebug() внутри себя содержит объект QTextStream на базе QObject'a и только в деструкторе выводится сообщение в консоль. Разрушаемый QObject шлет сигнал destroyed() после каждого вызова qDebug(), появляется рекурсия, которая неизбежно приводит к крашу. Мне просто необходимо снимать свой фильтр событий перед выводом в консоль, а затем ставить его снова. Но это уже давно не проблема. Я создал глобальную копию QTextStream и отказался от всех вкусносней перегрузки оператора << в qDebug(), а в деструкторе QApplication вызываю снятие фильтра, чтобы программа не крашилась при выходе.
Дело в том, что система фильтрации требует в качестве фильтруемой функции - статическую функцию. Что мне остается? Создавать синглтон или по копии некоторого класса в каждой из, эмм 5 функций (4 на каллбэки сигналов, 1 на фильтр QEvent'ов). Но даже если описать обработчики событий в качестве методов. Их будет больше 30 или один огромный switch() case. |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Рискуя нарваться на фразу из первого поста "буст не предлагать" все же предложу boost::bind в крайнем случае можно написать что-то свое, специфическое. Это сообщение отредактировал(а) azesmcar - 30.4.2010, 22:07 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
две функции Register и Unregister или одна с флагом и опять же никакого множественного использования структуры.. Добавлено через 54 секунды нда.. помойму Вы не через окно, а через форточку пытаетесь пролезть.. |
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
По идее тут можно обойтись и стандартным std::bind1st(std::mem_fun(&MyClass::myMethod), pointerToMyClassExemplar). Но что в итоге мне это даст, класс с теми же 30 методами-хендлерами? Даже для Unregister требуется передать всю ту же структуру с нулевыми значениями в указателях. Какая разница будет это обертка типа:
или
Мне необходимо контролировать жизнь глобального объекта (потому, что я использую функции вместо методов) и жизнь глобального объекта заканчивается после деструктора экземпляра класса QApplication. Это сообщение отредактировал(а) SABROG - 30.4.2010, 22:20 |
||||||
|
|||||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
"описать обработчики" и "будет свитч" между собой не связаны.. повторюсь, помойму Вы перенамутили.. Добавлено @ 22:20 "заступлюсь" за тс в этом случае, так как никакой динамики требущей бинда тут нет.. Добавлено @ 22:21
Ну так может прежде Вы нам ответите на вопрос, как ваши 30 хандлеров связаны с регистрацией фильтра ? Это сообщение отредактировал(а) mes - 30.4.2010, 22:21 |
||||||
|
|||||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Тогда давайте вернемся к черной коробке с именем (OS). Есть одна функция (свой фильтр), которая принимает эвент от ОС. Количество возможных состояний в эвенте больше 30 и нужно каждое из них обработать. Как поступить? Здоровенный switch() case с >30 вариантами, который по размеру будет как весь код утилиты xev или 30 обработчиков? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
давайте.. Пока не понятно по какому принципу связан евент и 30 вариантов. По имени, числовой константе, зависит от состояния звезд statemachine или иначе ? если связь прямая, то через отражение на словарь, для порядковых констант - линейный вектор, а для не порядковых и имен map и т.д ну и все таки какя взаимосвязь хоть через switch , хоть без него ?! Это сообщение отредактировал(а) mes - 30.4.2010, 22:32 |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
То ли я уже нажрался в хлам, то ли просто не могу тебя понять. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, все имена состояний описаны в системном хедере линукса. Я их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления. В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.
Массив имен есть (static const char* []), значения констант есть (int), имена есть (MyEnum::myName1). Чего не хватает, того массива с адресами обработчиков в первом посте? Тоже есть. Но правильно ли это? Структура, где были 4 указателя это для сигналов и слотов. Тут всё очень просто, никаких состояний нет. Тут как бы вопрос закрыт, я понял, что шел правильным путем, только сам язык C++ немного расстроил, пришлось написать больше, чем хотелось бы. Затем идет второй вопрос с хэндлерами. Это уже тема отдельная, тут ставится всего-лишь один фильтр через передачу адреса на статический метод. Проблема в организации системы обработки этих событий внутри обычной статической функции. Либо писать портянку, либо обрабатывать каждое состояние еще в >30 отдельных функциях. Но ИМХО быстрей получить указатель на функцию через индекс, чем делать >30 сравнений с нужным состоянием. Это сообщение отредактировал(а) SABROG - 30.4.2010, 22:43 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
обьект может сам этим заниматься.. разницы нет функции или функции-члены
не требуется.. Register и Unregister статические функции члены класса, также как и саллбяки фильтрации. |
|||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 1 Всего: 91 |
Конечно может. Только если он решит, что должен уничтожаться до деструктора моего класса - будет проблема. Ну разница обычно в том, что статические функции-члены не имеют доступа к членам класса в отличае от методов. Конечно можно приводить qApp к моему классу, чтобы получить указатель на объект класса.
Но это же еще одна функция. Не лучше ли просто передать аргумент по умолчанию инициализированный нулевыми значениями? Хотя с unregister() повышается читабельность кода, тут надо подумать, что мне важнее, понимать код через пару лет или искать комментария по коду и в голове прокручивать логику. |
||||
|
|||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Ну мне откуда должно быть это известно, что там у Вас, если Вы этого не говорили ? тем более что мы не в ветке линукса сидим Терь знаем.. значит удобно отразить на вектор. оистался вопрос вектор чего.. Вот это опять вода.. суть порядковые они или нет ?
и это вполне можно было опустить ) исходя из того как я понял представленное, не очень. Добавлено через 6 минут и 41 секунду
мм.. кто он ? зачем ? статические функции фильтра адресуют вызов методу обработчика, который представлен например статической переменной.. Добавлено через 12 минут и 59 секунд да, только не функция, а статическая функция-член
не лучше, так как как можно выделить как единицу логики - как регистрировать фильтр лучше всего знает фильтр.. вам же нужно не произвольный набор колбяков регистровать, а именно фильтр. |
||||||||
|
|||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |