Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Процесы

830
26 января 2006 года
MVal
76 / / 17.10.2002
Есть у меня в приложении два "второстепенных" процеса (TThread-а). В одном - я полуычаю пакеты через IdTCPClient и укладываю их в очередь из TMemoryStream-ов. В другом - обрабатываю полученные данные (из этой очереди). После чего пишу их в другую очередь (тоже из TMemoryStream-ов) и первый процесс их отправляет.
Процессы зациклены и останавливаются только по дисконекту IdTCPClient-а.
Все бы было хорошо, но иногда возникает Acces violation (видимо при одновременном обращении из разных процессов если один пишет в очередь, а другой, в этот момент - этот элемент считывает (мое предположение)).
Как от этого избавиться? try - catch не всегда спасает.
585
26 января 2006 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by MVal
Есть у меня в приложении два "второстепенных" процеса (TThread-а). В одном - я полуычаю пакеты через IdTCPClient и укладываю их в очередь из TMemoryStream-ов. В другом - обрабатываю полученные данные (из этой очереди). После чего пишу их в другую очередь (тоже из TMemoryStream-ов) и первый процесс их отправляет.
Процессы зациклены и останавливаются только по дисконекту IdTCPClient-а.
Все бы было хорошо, но иногда возникает Acces violation (видимо при одновременном обращении из разных процессов если один пишет в очередь, а другой, в этот момент - этот элемент считывает (мое предположение)).
Как от этого избавиться? try - catch не всегда спасает.


Мьютексы, критические секции и семафоры вам в руки

830
27 января 2006 года
MVal
76 / / 17.10.2002
Цитата:
Originally posted by honeybeer
Мьютексы, критические секции и семафоры вам в руки


А пример можно, как правильно "семафорить"?

4.8K
27 января 2006 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by MVal
А пример можно, как правильно "семафорить"?


Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.

Процесс №1

 
Код:
.....
//Далее выполняем обращение к некому ресурсу,
//не позволяющему многочтения...
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код


Процесс №2
 
Код:
.....
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код

До тех пор, пока один из процессов не покинет крит. секцию, другой в нее не войдет и будет ждать (висеть).

Перед тем как это использовть, критическую секцию нужно создать
 
Код:
InitializeCriticalSection(&cs);

После того, как она станет ненужной, ее нужно убить
 
Код:
DeleteCriticalSection(&cs);

Объявление
 
Код:
CRITICAL_SECTION cs;

246
27 января 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Jump
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.

Процесс №1
 
Код:
.....
//Далее выполняем обращение к некому ресурсу,
//не позволяющему многочтения...
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код


Процесс №2
 
Код:
.....
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код

До тех пор, пока один из процессов не покинет крит. секцию, другой в нее не войдет и будет ждать (висеть).

Перед тем как это использовть, критическую секцию нужно создать
 
Код:
InitializeCriticalSection(&cs);

После того, как она станет ненужной, ее нужно убить
 
Код:
DeleteCriticalSection(&cs);

Объявление
 
Код:
CRITICAL_SECTION cs;


Все понятно кроме одного, что вы с MVal подразумеваете под словом ПРОЦЕСС?

406
28 января 2006 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by GIZMO
Все понятно кроме одного, что вы с MVal подразумеваете под словом ПРОЦЕСС?



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

4.8K
28 января 2006 года
Jump
128 / / 09.11.2005
Первый пост читаем, да ;)

Цитирую: два "второстепенных" процеса (TThread-а)

Использую терминологию афтара ;)
830
31 января 2006 года
MVal
76 / / 17.10.2002
Цитата:
Originally posted by Jump
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.


Спасибо.
Как раз вот это я и хотел.

246
01 февраля 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Jump
Первый пост читаем, да ;)

Цитирую: два "второстепенных" процеса (TThread-а)

Использую терминологию афтара ;)


А поправить человека нельзя? Он до сих пор процесс от потока не отличает.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог