Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу CppEvents как поставить защиту
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
kjam kjam вне форума
Member
 
Сообщений: 111
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.04.2007
По умолчанию CppEvents как поставить защиту - 03.02.2010, 15:47

Сомневался, создавать этот топик здесь или в "Зацените!", но в конце-концов, с учетом специфики либы, решил отписаться здесь.

CppEvents - моя open-source либа, которая на днях была доведена до релиза, в связи с чем выносится на обсуждение. Либа предоставляет реализацию механизма событий/делегатов (сигналов/слотов) для C++. При разработке я ориентировался на аналогичные механизмы в C# и Qt, библиотеки Boost.Signals, LibSigC++ и SigSlot, и считаю что полученное решение превосходит остальные реализации.

Как и указанные библиотеки, моя основывается на шаблонах, но при этом точка зрения, с которой рассматривались события значительно отличается от других шаблонных реализаций, и лежит ближе к реализациям в C# и Qt. Я рассматривал событие не как самостоятельный объект, а в первую очередь как член класса, как средство представления в интерфейсе класса обратных сообщений, по аналогии с тем как функции-члены представляют прямые. Обработчиками событий также являются не объекты, а отдельные методы объектов (делегаты).

Как и в C#, события могут быть виртуальными и чисто виртуальными, могут использоваться в интерфейсах (мне этого ощутимо не хватало при работе с Qt).

Как и другие виды членов класса, события могут иметь уровень доступа. Но, в отличии от, скажем, функций-членов, события имеют два интерфейса - один для подключения обработчиков, другой для активации события. Моя реализация дает полный контроль над уровнями доступа. В C# - уровень доступа для интерфейса подключения задается явно, для интерфейса активации - всегда private, в Qt - всегда public/protected, в других шаблонных реализациях уровень доступа для интерфейсов не разделяется, что является грубым нарушением инкапсуляции. Таким образом, событие как сущность состоит из двух элементов - переменной-члена класса Cpp::Event<>, которая предоставляет интерфейс активации, и функции, которая возвращает временный объект класса Cpp::EventRef<>, который реализует интерфейс управления соединениями.

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

В минимальном объеме поддерживается параметризация делегатов - при соединении можно указать несколько значений, которые будут переданы в делегат как начальные аргументы. Как и в Qt последние аргументы события, которые "не влазят" в сигнатуру делегата, молча игнорируются. Также работает автоматическое преобразование типа аргументов события в типы аргументов делегата. Я не пытался реализовать возможности сравнимые с boost::bind, но постарался сделать синтаксис максимально удобочитабельным и лаконичным.

Реализовано автоматическое разъединение. В отличии от Boost.Signals и LibSigC++ оно работает всегда - написать код, который работает не так, как вы того ожидаете, намного сложнее. Автоматическое разъединение реализовано не в базовом классе, а во внешнем объекте - это дает большую гибкость в управлении соединениями и решает проблему запоздалого разъединения - если событие будет сгенерировано в процессе работы деструкторов промежуточных классов, то может быть вызван метод объекта, который уже не существует.

Библиотека является полностью потокобезопасной. Для обеспечения потокобезопасности используются атомарные счетчики и мьютексы. Для экономии ресурсов мьютексы создаются по одному на поток и разделяются между всеми объектами созданными в этом потоке (также сделано и в Qt). Указатель на мьютекс хранится в TLS. Абстракции синхронизационных примитивов реализованы для WinAPI и POSIX Threads + GCC intrinsics.

Мне удалось добиться очень эффективной реализации - по результатам замеров быстродействия мое детище работает в 6-8 раз быстрее Boost.Signals и в 1,5-2 раза быстрее Qt, так что реализацией внутренностей я весьма доволен, но вот над юзабилити еще собираюсь поработать - в частности, внешний connection scope сильно напрягает меня самого.

Библиотека хостится на гугл-коде - http://code.google.com/p/cpp-events. Дополнительную информацию, в частности tutorial с полу-реальными примерами, можно найти в wiki на сайте.
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 03.02.2010, 15:56

Гм. Любопытно. По этому описанию все выглядит изящно. Ладно, поглядим.... заценим....
Спасибо!


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как снять защиту от записи? Anatoly Любые вопросы от новичков 5 04.04.2011 07:57
Конвертирование видео как снять защиту? хороняка Любые вопросы от новичков 0 05.07.2010 15:02
Где взять защиту от копирования дисков? ВикторияС Техническая поддержка 1 18.12.2008 17:58
Возможно ли обойти защиту для установки программы? Voron Любые вопросы от новичков 6 15.11.2008 18:26
Помогите установить антивирусную защиту на ПК. Anton_Rizhka Любые вопросы от новичков 2 27.08.2008 21:29
Как поставить защиту на SQL 2000 Jon1 MSSQL Server 3 17.03.2008 08:15
Как поставить защиту на программу Shturmovuk Delphi 5 07.02.2008 01:08
Как програмно отключить защиту листа XL? Voldyr Visual Basic 3 10.05.2007 20:01
Как обойти защиту файлов висты? KpoLiK Софт и программы 2 18.04.2007 13:43
Как сделать простейшую защиту программы Виталик C++ Builder 2 07.08.2006 21:29
Как поставить на CSpinButton поставить свой обработчик сообщений imported_zmey Visual C++ 1 11.07.2004 16:00
Как поставить парольную защиту на отдельную страницу glip PHP 9 09.08.2002 17:40



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов