Здравствуйте, RSATom, Вы писали:
RSA>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?
Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.
Здравствуйте, Алекс, Вы писали:
А>Здравствуйте, RSATom, Вы писали:
RSA>>если я из двух нитей делаю SetEvent, а потом только из одной ReleaseEvent, Event останется в Signaled State или нет?
А>Нужно точно знать, ы какой последовательности вызываются эти функции. И вообще, мне кажется это не здоровый вопрос. Объясни ситуацию по подробнее.
В общем так: Есть manual reset event, нить №1, нить №2.
1) Нить №1 делает SetEvent
2) Нить №2 делает SetEvent
3) Нить №1 делает ResetEvent
4) В каком состоянии находится Event?
Здравствуйте, 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 .
(Ну и самое главное это один и тотже обьект ядра я надеюсь).
И я вобще не вижу целесообразность таких действий — здесь нет синхронизации — ну правда если присутствуют еще какие нибуть обьекты — то все может быть.
Здравствуйте, 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 это уже сделала.
Завидую людям, которые могут себе позволить никуда не спешить.
хъ
RSA>В общем так: Есть manual reset event, нить №1, нить №2. RSA>1) Нить №1 делает SetEvent RSA>2) Нить №2 делает SetEvent RSA>3) Нить №1 делает ResetEvent RSA>4) В каком состоянии находится Event?
И мел в виду последовательность вызовов в их хронометрическом порядке. Вполне может оказаться так, что второй поток установит событие после того, как первый сделает ResetEvent.
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).
Думаю нужно описать проблему поподробней:
Есть некий пассивный информационный обьект, в моем случае это DataSet.
Так же есть 2 нити со следующей функциональностью:
№1 занимается отображением данных из DataSet
№2 занимается добавлением данных в DataSet
Пока нить номер 2 заполняет DataSet необходимо с некоторой регулярностью отображать в нити №1 чего он там надобавлял.
Причем может быть ситуация когда интерфейсная нить добавляет данные в DataSet, это когда пользователь вводит информацию. Соотвественно необходимо каким то образом говорить что эта нить может добавлять данные а все остальные могут только считывать.
Здравствуйте, User99, Вы писали:
U>Пусть есть поставщики чегото, и исполнитель. Все живут в своих потоках. U>Первый поток предоставил данные на выполнение и дернул событие( событие активно), по которому исполнитель приступает к работе, но исполнитель в это время занят, и второй поставщик предоставил данные и дернул это же событие( оно как было активным, так и "стало " активным). Исполнитель освободился, забрал данные и сделел Reset(1 Reset событие в пассивном состоянии второй ни на что не повлияет, равно как и второй setEvent).
Думаю, что в этом случае целесообразно было бы использовать два Event-а:
1-й означает готовность исполнителя к обработке данных
2-й готовность поставщика передать данные
оба Event-а с автосбросом
Принцип работы:
1. Исполнитель выставляет 1-й Event и ждет 2-й
2. Один из поставщиков получает управление, подготавливает данные, выставляет 2-й Event
3. Исполнитель поймал 2-й Event, обработал данные, далее шаг 1.
Завидую людям, которые могут себе позволить никуда не спешить.
<...поскипано...>
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 Просто я думал может кто что то лучше может предложить...
Здравствуйте, RSATom, Вы писали:
RSA>Думаю нужно описать проблему поподробней: RSA>Есть некий пассивный информационный обьект, в моем случае это DataSet. RSA>Так же есть 2 нити со следующей функциональностью: RSA>№1 занимается отображением данных из DataSet RSA>№2 занимается добавлением данных в DataSet
RSA>Пока нить номер 2 заполняет DataSet необходимо с некоторой регулярностью отображать в нити №1 чего он там надобавлял. RSA>Причем может быть ситуация когда интерфейсная нить добавляет данные в DataSet, это когда пользователь вводит информацию. Соотвественно необходимо каким то образом говорить что эта нить может добавлять данные а все остальные могут только считывать.
RSA>Вот и вся задача. RSA>Как это делается?
Если нити находятся в одном процессе, разграничение доступа к данным можно реализовать через критическую секцию.
Нить №2
EnterCriticalSection
Изменить данные
LeaveCriticalSection
Недостаток — только одна нить может получить доступ к данным
Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
Завидую людям, которые могут себе позволить никуда не спешить.
Здравствуйте, _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()
Здравствуйте, RSATom, Вы писали:
RSA>У меня тоже получалось 2 Eventa Просто я думал может кто что то лучше может предложить...
Единственный момент который непонятен: нить добавляющая данные может быть только одна а нитей считывающих данные может быть произвольное количество. Причем нить добавляющая данные не должна начинать добавление до того как есть хотя бы одна нить считывающая данные.
Здравствуйте, _Dinosaur, Вы писали:
D>Недостаток — только одна нить может получить доступ к данным D>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность
В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные
Здравствуйте, RSATom, Вы писали:
RSA>Здравствуйте, _Dinosaur, Вы писали:
D>>Недостаток — только одна нить может получить доступ к данным D>>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность RSA>В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные
Насколько я понял необходимо получить доступ к данным в какой-то СУБД?
Если так, то можно для каждой нити создать DataSet и пусть каждая нить с ним работает
А доступ к данным пусть разграничивает СУБД.
Завидую людям, которые могут себе позволить никуда не спешить.
Здравствуйте, _Dinosaur, Вы писали:
D>Здравствуйте, RSATom, Вы писали:
RSA>>Здравствуйте, _Dinosaur, Вы писали:
D>>>Недостаток — только одна нить может получить доступ к данным D>>>Преимущество — использование критической секции не требует объекта ядра, что увеличивает производительность RSA>>В том то и дело что нить занимающаяся изменением/добавлением может на достаточно длительное время и необходимо в это время тем не менее иметь возможность считывать данные
D>Насколько я понял необходимо получить доступ к данным в какой-то СУБД? D>Если так, то можно для каждой нити создать DataSet и пусть каждая нить с ним работает D>А доступ к данным пусть разграничивает СУБД.
В том то и дело что у меня есть несколько плагинов для работы с разными базами данных, и есть классы посредством которых общается интерфейс и плагин. Эти классы общие для всех плагинов. Соответственно весь мэнеджемнт многопоточности лежит на мне...