Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 09:08   #1
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию Событийная модель в C#

Привет!

Недавно добрался до изучения событий в C# и в связи с чем возникло некоторое недопонимание, может быть растолкуете.
Если брать обычные win приложения, то там все понятно: любой объект в контексте процесса, способен посылать записи/объекты типа "сообщения" в систему, система при этом заносит их в очередь, созданную для процесса приложения и формирует объект "событие" с занесением в журнал событий. Затем в главном потоке крутящаяся процедура-"окна" выдирает из очереди сообщение и обрабатывает его.

Реализация же на C# с делегатами демонстрирует, что ни каких сообщений не посылается, а всего лишь в нужный момент вызывается функция-"обработчик", по адресу, который передается при создании объекта делегата. Причем в VStudio проследить это дело как-то не получается или просто не знаю как. Либо они компилятор так замудрили,
что уже не понятно, во что на самом деле превращается мой код в JIT-е. По идеи сама framefork работает в контексте системы и следовательно должна иметь возможность регистрировать мои собственные типы сообщений, но получается, что даже сообщение и событие у них что-то единое и не возможно выдернуть стандартные для сообщения L и W параметры.

Что же там на самом деле происходит?
VadEr вне форума Ответить с цитированием
Старый 28.10.2010, 13:59   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

На сколько я знаю, в случае с WinForms, все эти делегаты по сути являются обёртками над сообщениями WinAPI. Ну где-то там в недрах есть метод типа WinMain из С++:
Код:
switch (message)
{
case WM_ACTIVE:
  OnActive(...); // запускаем соответствующее событие, на которое навешаны делегаты
  break;
}
В общем, ничего сверхъестественного и гениального там нет. Всё как обычно.
pu4koff вне форума Ответить с цитированием
Старый 30.10.2010, 18:08   #3
elja_1989
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 58
По умолчанию

делегат врятли обертка.. но events C# думаю базируются на WM_*** просто с грамотными враперами, без этой шляпы)
elja_1989 вне форума Ответить с цитированием
Старый 01.11.2010, 09:00   #4
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

ну все равно, как-то это все подозрительно....
чего-то они не договаривают
VadEr вне форума Ответить с цитированием
Старый 01.11.2010, 09:12   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
но получается, что даже сообщение и событие у них что-то единое и не возможно выдернуть стандартные для сообщения L и W параметры.
Зачем? Есть обработчики, которые вам сами дают уже представлены в нормальном виде параметры + установить хук (в WPF) или переопределить WndProc (в Winforms) никто не запрещал?!

Далее, верно, фреймворк проверяет рабочую платформу, и в соответствии устанавливает определенный цикл обработки сообщений, системных (хочется верить что это именно так). Далее, делегат = обработчик, не равны. Т.к., делегат, это по сути список обработчиков, -= удаление, += добавление.

Собственно так и не ясно, что вы хотите, чего вам не хватает?
BOBAH13 вне форума Ответить с цитированием
Старый 02.11.2010, 08:19   #6
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

наверное полного контроля за ситуацией, что не дают
получается даже прерывания поставить нельзя - "int 3"
VadEr вне форума Ответить с цитированием
Старый 02.11.2010, 08:30   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от VadEr Посмотреть сообщение
наверное полного контроля за ситуацией, что не дают
получается даже прерывания поставить нельзя - "int 3"
Поставить прерывания в Win32/64 ? Вы серьезно что ли? Я вообще чег то не понял, причем Это вообще тут?!
BOBAH13 вне форума Ответить с цитированием
Старый 02.11.2010, 10:44   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Поставить прерывания в Win32/64 ?
, да еще и в .NET.
ТС, вы сейчас как бы в иной позиции, чем скажем ассемблерщики.
почитайте что такое .NET, половина вопросов отпадет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фреймовая модель Шушелла Помощь студентам 0 15.05.2010 00:20
3d модель в Delphi KISSkaэсМЕральда Помощь студентам 6 01.04.2010 17:25
Модель данных fobass SQL, базы данных 3 19.01.2010 22:09
Модель амебы. Alex Cones Свободное общение 25 14.01.2010 22:20
Даталогическая модель Шульц БД в Delphi 0 27.12.2008 23:44