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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов про массив хэндлеров, и инициализацию структуры нулевыми знач. 
:(
    Опции темы
mes
Дата 30.4.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
Я стараюсь не использовать синглтоны

синглетон не суть, он только для удобства представления мысли.. 

Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
у меня просто выбора нет, я наследуюсь от синглтона библиотеки.

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

Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
он статичен и зависит только от версии библиотеки. 

ну так видите сколько нужного Вы держали в секрете 
smile

Добавлено через 3 минуты и 8 секунд
Цитата(SABROG @  30.4.2010,  19:44 Найти цитируемый пост)
Те 4 каллбэка остаются как и были, их количество неизменно. А эти 30 каллбэков это уже реакция всего-лишь на один каллбэк, который принимает в себе эвент от ОС, который может принимать выше 30 состояний.


тогда не пойму что мы всю тему обсуждали, если у Вас каллбяки один раз подключились и один раз отключились ?!

Добавлено через 4 минуты и 41 секунду
Вы уж простите меня как топик_стартер, но я выступаю за то, чтоб считать тему не законченной и ожидаю подробностей задачи. 
smile


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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(mes @  30.4.2010,  20:51 Найти цитируемый пост)
Вы уж простите меня как топик_стартер, но я выступаю за то, чтоб считать тему не законченной и ожидаю подробностей задачи. 

Я тоже требую продолжения банкета smile 
PM   Вверх
SABROG
Дата 30.4.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.4.2010,  20:51 Найти цитируемый пост)
и ожидаю подробностей задачи

Как вы могли догадываться всё дело пишется на 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 в качестве класса для отладки событий приложения, ну и в академическо-образовательных целях.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



1. Вы устанавливает свой фильтр вместо фильтра приложения. 
2. Там Вы отлавливаете XEvent и в зависимости от него вызываете, я так понимаю,  один из системных методов приложения.
теперь где возникла проблема ? 
в пункте один никакого многоразового использования структуры нет,
а к пункту два это структура никоим образом не относится...

Добавлено через 7 минут и 5 секунд
Цитата(SABROG @  30.4.2010,  20:07 Найти цитируемый пост)
. Наследование не отъемлемая часть, я наследуюсь от QApplication.

хочу также обратить внимание на то, что наследование нужно лишь для выполнения одной части работы, а и имено для подключения системы фильтрации..
Сама же обработка событий желательно должна быть описана в другом классе.



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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
Там Вы отлавливаете XEvent и в зависимости от него вызываете, я так понимаю,  один из системных методов приложения.
теперь где возникла проблема ? 

Проблем с реализацией нет. Я изначально вопрос поставил в контексте "правильного стиля программирования".

Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
в пункте один никакого многоразового использования структуры нет,

Это не совсем так. Дело в том, что qDebug() внутри себя содержит объект QTextStream на базе QObject'a и только в деструкторе выводится сообщение в консоль. Разрушаемый QObject шлет сигнал destroyed() после каждого вызова qDebug(), появляется рекурсия, которая неизбежно приводит к крашу. Мне просто необходимо снимать свой фильтр событий перед выводом в консоль, а затем ставить его снова. Но это уже давно не проблема. Я создал глобальную копию QTextStream и отказался от всех вкусносней перегрузки оператора << в qDebug(), а в деструкторе QApplication вызываю снятие фильтра, чтобы программа не крашилась при выходе.


Цитата(mes @  30.4.2010,  21:32 Найти цитируемый пост)
Сама же обработка событий желательно должна быть описана в другом классе.

Дело в том, что система фильтрации требует в качестве фильтруемой функции - статическую функцию. Что мне остается? Создавать синглтон или по копии некоторого класса в каждой из, эмм 5 функций (4 на каллбэки сигналов, 1 на фильтр QEvent'ов). Но даже если описать обработчики событий в качестве методов. Их будет больше 30 или один огромный switch() case.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 30.4.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(SABROG @  30.4.2010,  22:00 Найти цитируемый пост)
Дело в том, что система фильтрации требует в качестве фильтруемой функции - статическую функцию. 

Рискуя нарваться на фразу из первого поста "буст не предлагать" все же предложу boost::bind smile 
в крайнем случае можно написать что-то свое, специфическое.

Это сообщение отредактировал(а) azesmcar - 30.4.2010, 22:07
PM   Вверх
mes
Дата 30.4.2010, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
Мне просто необходимо снимать свой фильтр событий перед выводом в консоль, а затем ставить его снова. 

две функции Register и Unregister или одна с флагом и опять же никакого множественного использования структуры..

Добавлено через 54 секунды
Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
а в деструкторе QApplication

нда.. помойму Вы не через окно, а через форточку пытаетесь пролезть..



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


Hacker
****


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

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



Цитата(azesmcar @  30.4.2010,  22:06 Найти цитируемый пост)
boost::bind

По идее тут можно обойтись и стандартным std::bind1st(std::mem_fun(&MyClass::myMethod), pointerToMyClassExemplar). Но что в итоге мне это даст, класс с теми же 30 методами-хендлерами?

Цитата(mes @  30.4.2010,  22:12 Найти цитируемый пост)
и опять же никакого множественного использования структуры..

Даже для Unregister требуется передать всю ту же структуру с нулевыми значениями в указателях. Какая разница будет это обертка типа:

Код

void unregister()
{
    MyStruct mc = {0};
    setFilter(mc);
}


или 

Код

void setFilter(MyStruct ms = (MyStruct){0, 0, 0, 0}) // ну или (MyClass mc = MyClass())
{
    setFilter(ms);
}


Цитата(mes @  30.4.2010,  22:12 Найти цитируемый пост)
нда.. помойму Вы не через окно, а через форточку пытаетесь пролезть..

Мне необходимо контролировать жизнь глобального объекта (потому, что я использую функции вместо методов) и жизнь глобального объекта заканчивается после деструктора экземпляра класса QApplication.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 22:20


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
Создавать синглтон или по копии некоторого класса в каждой из, эмм 5 функций (4 на каллбэки сигналов, 1 на фильтр QEvent'ов).

 smile 

Цитата(SABROG @  30.4.2010,  21:00 Найти цитируемый пост)
. Но даже если описать обработчики событий в качестве методов. Их будет больше 30 или один огромный switch() case. 

"описать обработчики" и "будет свитч" между собой не связаны.. 

повторюсь, помойму Вы перенамутили..

Добавлено @ 22:20
Цитата(azesmcar @  30.4.2010,  21:06 Найти цитируемый пост)
Рискуя нарваться на фразу из первого поста "буст не предлагать" 

"заступлюсь" за тс в этом случае, так как никакой динамики требущей бинда тут нет..

Добавлено @ 22:21
Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
Но что в итоге мне это даст, класс с теми же 30 методами-хендлерами? 

Ну так может прежде Вы нам ответите  на вопрос, как ваши 30 хандлеров связаны с регистрацией фильтра ? 


Это сообщение отредактировал(а) mes - 30.4.2010, 22:21


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:16 Найти цитируемый пост)
повторюсь, помойму Вы перенамутили.. 

Тогда давайте вернемся к черной коробке с именем (OS). Есть одна функция (свой фильтр), которая принимает эвент от ОС. Количество возможных состояний в эвенте больше 30 и нужно каждое из них обработать. Как поступить? Здоровенный switch() case с >30 вариантами, который по размеру будет как весь код утилиты xev или 30 обработчиков?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  21:23 Найти цитируемый пост)
Тогда давайте вернемся к черной коробке с именем (OS). Есть одна функция (свой фильтр), которая принимает эвент от ОС. Количество возможных состояний в эвенте больше 30 и нужно каждое из них обработать. Как поступить? Здоровенный switch() case с >30 вариантами, который по размеру будет как весь код утилиты xev или 30 обработчиков? 

давайте.. Пока не понятно по какому принципу связан евент и 30 вариантов. По имени, числовой константе, зависит от состояния звезд statemachine или иначе ?
если связь прямая,  то через отражение на словарь, для порядковых констант - линейный вектор, а для не порядковых и имен map и т.д

ну и все таки какя взаимосвязь 
Цитата(mes @  30.4.2010,  21:16 Найти цитируемый пост)
с регистрацией фильтра

хоть через switch , хоть без него ?!


Это сообщение отредактировал(а) mes - 30.4.2010, 22:32


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:26 Найти цитируемый пост)
Пока не понятно по какому принципу связан евент и 30 вариантов

То ли я уже нажрался в хлам, то ли просто не могу тебя понять. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, все имена состояний описаны в системном хедере линукса. Я их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления. В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.

Цитата(mes @  30.4.2010,  22:26 Найти цитируемый пост)
если связь есть,  то через отражение на словарь, для порядковых констант - линейный вектор, а для имен map.

Массив имен есть (static const char* []), значения констант есть (int), имена есть (MyEnum::myName1). Чего не хватает, того массива с адресами обработчиков в первом посте? Тоже есть. Но правильно ли это?

Цитата(mes @  30.4.2010,  22:26 Найти цитируемый пост)
хоть через switch , хоть без него ?!

Структура, где были 4 указателя это для сигналов и слотов. Тут всё очень просто, никаких состояний нет. Тут как бы вопрос закрыт, я понял, что шел правильным путем, только сам язык C++ немного расстроил, пришлось написать больше, чем хотелось бы.

Затем идет второй вопрос с хэндлерами. Это уже тема отдельная, тут ставится всего-лишь один фильтр через передачу адреса на статический метод. Проблема в организации системы обработки этих событий внутри обычной статической функции. Либо писать портянку, либо обрабатывать каждое состояние еще в >30 отдельных функциях. Но ИМХО быстрей получить указатель на функцию через индекс, чем делать >30 сравнений с нужным состоянием.

Это сообщение отредактировал(а) SABROG - 30.4.2010, 22:43


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
Мне необходимо контролировать жизнь глобального объекта

обьект может сам этим заниматься..


Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
потому, что я использую функции вместо методов

разницы нет функции или функции-члены


Цитата(SABROG @  30.4.2010,  21:15 Найти цитируемый пост)
Даже для Unregister требуется передать всю ту же структуру с нулевыми значениями в указателях

не требуется.. Register и Unregister статические функции члены класса, также как и саллбяки фильтрации.


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


Hacker
****


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

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



Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
обьект может сам этим заниматься..

Конечно может. Только если он решит, что должен уничтожаться до деструктора моего класса - будет проблема.

Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
разницы нет функции или функции-члены

Ну разница обычно в том, что статические функции-члены не имеют доступа к членам класса в отличае от методов. Конечно можно приводить qApp к моему классу, чтобы получить указатель на объект класса.

Цитата(mes @  30.4.2010,  22:46 Найти цитируемый пост)
не требуется.. Register и Unregister статические функции члены класса, также как и саллбяки фильтрации.

smile ну если подредактировать исходники Qt, то можно сделать, чтобы и не требовалось. Сейчас ты видимо говоришь о функциях обвязках, где присутствует подобный код:

Код

void unregister()
{
    MyStruct mc = {0};
    setFilter(mc);
}


Но это же еще одна функция. Не лучше ли просто передать аргумент по умолчанию инициализированный нулевыми значениями? Хотя с unregister() повышается читабельность кода, тут надо подумать, что мне важнее, понимать код через пару лет или искать комментария по коду и в голове прокручивать логику.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.4.2010, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
. Эвент - структура, в структуре есть int поле, которое может принимать 30 и более значений состояния, 

Ну мне откуда должно быть это известно, что там у Вас, если Вы этого не говорили ? тем более что мы не в ветке линукса сидим smile 
Терь знаем.. значит удобно отразить на вектор. оистался вопрос вектор чего.. smile


Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
их всех undef'нул и создал свой enum с такими же именами, а благодаря метаобъектной системе у этого enum'a еще и появился массив текстовых названий каждого члена перечисления.

Вот это опять вода.. суть порядковые они или нет ?



Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
В общем от числа (int) зависит то какой обработчик я запущу и то, что я буду спрашивать у ОС о дополнительной информации именно этого числового значения.

и это вполне можно было опустить )
Цитата(SABROG @  30.4.2010,  21:35 Найти цитируемый пост)
Тоже есть. Но правильно ли это?

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

Добавлено через 6 минут и 41 секунду
Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)

Конечно может. Только если он решит, что должен уничтожаться до деструктора моего класса - будет проблема.

мм.. кто он ?


Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Ну разница обычно в том, что статические функции-члены не имеют доступа к членам класса в отличае от методов. Конечно можно приводить qApp к моему классу, чтобы получить указатель на объект класса.

зачем ? статические функции фильтра адресуют вызов методу обработчика, который представлен например статической переменной..

Добавлено через 12 минут и 59 секунд
Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Но это же еще одна функция. 

да, только не функция, а статическая функция-член


Цитата(SABROG @  30.4.2010,  22:03 Найти цитируемый пост)
Не лучше ли просто передать аргумент по умолчанию инициализированный нулевыми значениями? 

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



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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