![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 10.03.2008
Сообщений: 68
|
![]()
Люди, помогите с проблемой. Допустим есть какое-то событие Event, которое происходит с неизвестным интервалом времени, и есть обработчик этого события - OnEvent. В который передаются данные, например, строка. Вопрос в следующем: событие может возникать очень часто и обработчик события, возможно, будет неуспевать обрабатывать переданные ему данные, как тут же запустится обработчик второго события. По идее, предотвратить это легко, например, семафором. То есть, тогда обработчик следующего события не запустится, пока не завершиться текущий. Но есть еще проблемка: нужно, чтобы события обрабатывались в той последовательности, в которой они появлялись. То есть, произошли собития Event с данными Data1, Event с данными Data2 и Event с данными Data3. Если использовать семафор, то вначале будет обрабатываться событие Event с данными Data1, а остальные будут ждать семафора. Но когда его обработка закончится, с равной вероятностью может выполняться как обработчик события Event с данными Data2, так и обработчик события Event с данными Data3. Нужно, чтобы они делались последовательно в том порядке, в котором они возникали. То есть, шла обработка вначале Event с данными Data1, потом Event с данными Data2 и потом Event с данными Data3. Помогите, как этого добиться?
|
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Да как нефиг делать. Для этого умные люди придумали очереди. Для твоего примера со строкой это будет массив строк, только его надо правильно организовать. А именно по принципу - Первый пришел-Первый ушел. Гугли LIFO и FIFO. При возникновения события ты пихаешь строку в очередь и передаешь управление обработчику. Обработчик берет только то событие которое первым стоит на очереди и никакое другое и все, наши победили.
А вот это: Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 10.03.2008
Сообщений: 68
|
![]()
События могут возникать быстро, а обрабатываться - долго. Про очереди была идейка, просто опять, если реализовывать их рукаим, то в очередь могут встать первая, потом третья, а потом вторая строка.
А так погуглю эти штуки, если будут вопросы - вернусь ![]() |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]() Цитата:
![]()
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 10.03.2008
Сообщений: 68
|
![]()
Есть Someobject с событием Event.
Тогда код будет выглядеть примерно так: Код:
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 10.03.2008
Сообщений: 68
|
![]()
Хм, люди. Есть вопрос, который возможно полностью решит мою проблему. Я думал в Delphi стандартные обработчики одних и тех же событий обрабатываются в разных потоках.
Для этой цели я решил сделать эксперимент, а именно: Установить таймер на 1 мсек и написать код: Код:
И справедливо ли это для обработчика procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);?? Просто я в обработчике делаю довольно долгую обработку полученной строки O(n^2) и пишу её в файл. Я не боялся, что будет двойное открытие файла для записи, эту проблему я знал как уладить. Я боялся, что запись в файл будет происходит не в том порядке, в котором приходит текст (могла прийти длинная, а потом короткая строка) (рассуждения из рисунка http://s011.radikal.ru/i315/1011/6d/71e6a15a0117.jpg). Выходит, мне не о чем беспокоится? |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обработка событий | meganom | Общие вопросы Delphi | 5 | 01.09.2010 19:41 |
Обработка событий из консоли | D_E_N | Общие вопросы Delphi | 2 | 24.07.2009 16:50 |
Обработка событий в Delphi | SlavaSH | Компоненты Delphi | 19 | 30.03.2009 11:00 |
Обработка событий в C++ Builder | BychkovVV | Помощь студентам | 3 | 02.03.2009 01:48 |