Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 08:42
Оценка:
если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?
Re: Вопрос по Win32 Event
От: Алекс Россия http://wise-orm.com
Дата: 02.12.02 09:07
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?


Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.
Re[2]: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 09:12
Оценка:
Здравствуйте, Алекс, Вы писали:

А>Здравствуйте, RSATom, Вы писали:


RSA>>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?


А>Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.


В общем так: Есть manual reset event, нить №1, нить №2.
1) Нить №1 делает SetEvent
2) Нить №2 делает SetEvent
3) Нить №1 делает ResetEvent
4) В каком состоянии находится Event?
Re[3]: Вопрос по Win32 Event
От: Whisperer  
Дата: 02.12.02 09:38
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>Здравствуйте, Алекс, Вы писали:


А>>Здравствуйте, RSATom, Вы писали:


RSA>>>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?


А>>Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.


RSA>В общем так: Есть manual reset event, нить №1, нить №2.

RSA>1) Нить №1 делает SetEvent
RSA>2) Нить №2 делает SetEvent
RSA>3) Нить №1 делает ResetEvent
RSA>4) В каком состоянии находится Event?
Так как у тебя событие с ручным сбросом то Event будет находится в несигнальном состояниии.

Но вот вопрос как ты определяешь ???? Что у тебя ResetEvent в thread N1 будет вызван после SetEvent в thread N2 .

(Ну и самое главное это один и тотже обьект ядра я надеюсь).

И я вобще не вижу целесообразность таких действий — здесь нет синхронизации — ну правда если присутствуют еще какие нибуть обьекты — то все может быть.
Re[3]: Вопрос по Win32 Event
От: _Dinosaur Россия  
Дата: 02.12.02 09:39
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>Здравствуйте, Алекс, Вы писали:


А>>Здравствуйте, RSATom, Вы писали:


RSA>>>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?


А>>Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.


RSA>В общем так: Есть manual reset event, нить №1, нить №2.

RSA>1) Нить №1 делает SetEvent
RSA>2) Нить №2 делает SetEvent
RSA>3) Нить №1 делает ResetEvent
RSA>4) В каком состоянии находится Event?

Event должен быть в несигнальном (сброшенном) состоянии
Непонятно зачем нить №2 делает SetEvent если нить №1 это уже сделала.
Завидую людям, которые могут себе позволить никуда не спешить.
Re[3]: Вопрос по Win32 Event
От: Алекс Россия http://wise-orm.com
Дата: 02.12.02 09:52
Оценка:
Здравствуйте, RSATom, Вы писали:

хъ

RSA>В общем так: Есть manual reset event, нить №1, нить №2.

RSA>1) Нить №1 делает SetEvent
RSA>2) Нить №2 делает SetEvent
RSA>3) Нить №1 делает ResetEvent
RSA>4) В каком состоянии находится Event?

И мел в виду последовательность вызовов в их хронометрическом порядке. Вполне может оказаться так, что второй поток установит событие после того, как первый сделает ResetEvent.
Re[4]: Вопрос по Win32 Event
От: User99  
Дата: 02.12.02 09:54
Оценка:
Здравствуйте, _Dinosaur, Вы писали:


RSA>>>>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?


А>>>Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.


RSA>>В общем так: Есть manual reset event, нить №1, нить №2.

RSA>>1) Нить №1 делает SetEvent
событие активно
RSA>>2) Нить №2 делает SetEvent
событие активно
RSA>>3) Нить №1 делает ResetEvent
событие пассивно независимо от того, сколько раз оно было переведено в активное состояние.
RSA>>4) В каком состоянии находится Event?
пассивно.

D>Event должен быть в несигнальном (сброшенном) состоянии

D>Непонятно зачем нить №2 делает SetEvent если нить №1 это уже сделала.
Может быть эти два потока вообще незнают друг о друге. Например:

Пусть есть поставщики чегото, и исполнитель. Все живут в своих потоках.
Первый поток предоставил данные на выполнение и дернул событие( событие активно), по которому исполнитель приступает к работе, но исполнитель в это время занят, и второй поставщик предоставил данные и дернул это же событие( оно как было активным, так и "стало " активным). Исполнитель освободился, забрал данные и сделел Reset(1 Reset событие в пассивном состоянии второй ни на что не повлияет, равно как и второй setEvent).
Re: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 10:09
Оценка:
Думаю нужно описать проблему поподробней:
Есть некий пассивный информационный обьект, в моем случае это DataSet.
Так же есть 2 нити со следующей функциональностью:
№1 занимается отображением данных из DataSet
№2 занимается добавлением данных в DataSet

Пока нить номер 2 заполняет DataSet необходимо с некоторой регулярностью отображать в нити №1 чего он там надобавлял.
Причем может быть ситуация когда интерфейсная нить добавляет данные в DataSet, это когда пользователь вводит информацию. Соотвественно необходимо каким то образом говорить что эта нить может добавлять данные а все остальные могут только считывать.

Вот и вся задача.
Как это делается?
Re[5]: Вопрос по Win32 Event
От: _Dinosaur Россия  
Дата: 02.12.02 10:15
Оценка:
Здравствуйте, User99, Вы писали:

U>Пусть есть поставщики чегото, и исполнитель. Все живут в своих потоках.

U>Первый поток предоставил данные на выполнение и дернул событие( событие активно), по которому исполнитель приступает к работе, но исполнитель в это время занят, и второй поставщик предоставил данные и дернул это же событие( оно как было активным, так и "стало " активным). Исполнитель освободился, забрал данные и сделел Reset(1 Reset событие в пассивном состоянии второй ни на что не повлияет, равно как и второй setEvent).


Думаю, что в этом случае целесообразно было бы использовать два Event-а:
1-й означает готовность исполнителя к обработке данных
2-й готовность поставщика передать данные
оба Event-а с автосбросом

Принцип работы:
1. Исполнитель выставляет 1-й Event и ждет 2-й
2. Один из поставщиков получает управление, подготавливает данные, выставляет 2-й Event
3. Исполнитель поймал 2-й Event, обработал данные, далее шаг 1.
Завидую людям, которые могут себе позволить никуда не спешить.
Re[6]: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 10:19
Оценка:
Здравствуйте, _Dinosaur, Вы писали:

<...поскипано...>

D>

D>Думаю, что в этом случае целесообразно было бы использовать два Event-а:
D>1-й означает готовность исполнителя к обработке данных
D>2-й готовность поставщика передать данные
D>оба Event-а с автосбросом

D>Принцип работы:

D>1. Исполнитель выставляет 1-й Event и ждет 2-й
D>2. Один из поставщиков получает управление, подготавливает данные, выставляет 2-й Event
D>3. Исполнитель поймал 2-й Event, обработал данные, далее шаг 1.

У меня тоже получалось 2 Eventa Просто я думал может кто что то лучше может предложить...
Re[2]: Вопрос по Win32 Event
От: _Dinosaur Россия  
Дата: 02.12.02 10:32
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>Думаю нужно описать проблему поподробней:

RSA>Есть некий пассивный информационный обьект, в моем случае это DataSet.
RSA>Так же есть 2 нити со следующей функциональностью:
RSA>№1 занимается отображением данных из DataSet
RSA>№2 занимается добавлением данных в DataSet

RSA>Пока нить номер 2 заполняет DataSet необходимо с некоторой регулярностью отображать в нити №1 чего он там надобавлял.

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

RSA>Вот и вся задача.

RSA>Как это делается?

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

Нить №1
EnterCriticalSection
Отобразить
LeaveCriticalSection

Нить №2
EnterCriticalSection
Изменить данные
LeaveCriticalSection


Недостаток — только одна нить может получить доступ к данным
Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
Завидую людям, которые могут себе позволить никуда не спешить.
Re[6]: Вопрос по Win32 Event
От: User99  
Дата: 02.12.02 10:33
Оценка:
Здравствуйте, _Dinosaur, Вы писали:

D>Здравствуйте, User99, Вы писали:


U>>Пусть есть поставщики чегото, и исполнитель. Все живут в своих потоках.

U>>Первый поток предоставил данные на выполнение и дернул событие( событие активно), по которому исполнитель приступает к работе, но исполнитель в это время занят, и второй поставщик предоставил данные и дернул это же событие( оно как было активным, так и "стало " активным). Исполнитель освободился, забрал данные и сделел Reset(1 Reset событие в пассивном состоянии второй ни на что не повлияет, равно как и второй setEvent).

D>

D>Думаю, что в этом случае целесообразно было бы использовать два Event-а:
D>1-й означает готовность исполнителя к обработке данных
D>2-й готовность поставщика передать данные
D>оба Event-а с автосбросом

D>Принцип работы:

D>1. Исполнитель выставляет 1-й Event и ждет 2-й
D>2. Один из поставщиков получает управление, подготавливает данные, выставляет 2-й Event
D>3. Исполнитель поймал 2-й Event, обработал данные, далее шаг 1.

Все зависит от специфики задачи.
Например можно сделать 1 Event для исполнителя и CreiticalSection на любой доступ к множеству комманд/данных.
Я обычно делаю так:
set<комманды> m_cmd;
CCriticalSection csCmd;
CEvent m_ev;
Поставщик:
csCmd.Lock()
добавляем комманды;
m_ev.Set();
csCmd.UnLock()


Исполнитель:
set<комманды> cmd;
Wait(m_ev);
csCmd.Lock()
cmd.swap(m_cmd);
m_ev.Reset();
csCmd.UnLock()
Выполняем(cmd)


Ну в общем мы уже отошли от темы. Предлагаю заканчивать.
Re[7]: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 10:34
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>У меня тоже получалось 2 Eventa Просто я думал может кто что то лучше может предложить...


Единственный момент который непонятен: нить добавляющая данные может быть только одна а нитей считывающих данные может быть произвольное количество. Причем нить добавляющая данные не должна начинать добавление до того как есть хотя бы одна нить считывающая данные.
Re[3]: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 10:38
Оценка:
Здравствуйте, _Dinosaur, Вы писали:

D>Недостаток — только одна нить может получить доступ к данным

D>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные
Re[4]: Вопрос по Win32 Event
От: _Dinosaur Россия  
Дата: 02.12.02 10:45
Оценка:
Здравствуйте, RSATom, Вы писали:

RSA>Здравствуйте, _Dinosaur, Вы писали:


D>>Недостаток — только одна нить может получить доступ к данным

D>>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
RSA>В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные

Насколько я понял необходимо получить доступ к данным в какой-то СУБД?
Если так, то можно для каждой нити создать DataSet и пусть каждая нить с ним работает
А доступ к данным пусть разграничивает СУБД.
Завидую людям, которые могут себе позволить никуда не спешить.
Re[5]: Вопрос по Win32 Event
От: RSATom Россия  
Дата: 02.12.02 10:48
Оценка:
Здравствуйте, _Dinosaur, Вы писали:

D>Здравствуйте, RSATom, Вы писали:


RSA>>Здравствуйте, _Dinosaur, Вы писали:


D>>>Недостаток — только одна нить может получить доступ к данным

D>>>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
RSA>>В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные

D>Насколько я понял необходимо получить доступ к данным в какой-то СУБД?

D>Если так, то можно для каждой нити создать DataSet и пусть каждая нить с ним работает
D>А доступ к данным пусть разграничивает СУБД.

В том то и дело что у меня есть несколько плагинов для работы с разными базами данных, и есть классы посредством которых общается интерфейс и плагин. Эти классы общие для всех плагинов. Соответственно весь мэнеджемнт многопоточности лежит на мне...
Re[6]: Вопрос по Win32 Event
От: _Dinosaur Россия  
Дата: 03.12.02 09:08
Оценка:
Здравствуйте, RSATom, Вы писали:

[]

Посмотри у Рихтера "Windows для профессионалов" глава 10
реализацию класса COptex
Завидую людям, которые могут себе позволить никуда не спешить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.