.....
//Далее выполняем обращение к некому ресурсу,
//не позволяющему многочтения...
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
Процесы
Процессы зациклены и останавливаются только по дисконекту IdTCPClient-а.
Все бы было хорошо, но иногда возникает Acces violation (видимо при одновременном обращении из разных процессов если один пишет в очередь, а другой, в этот момент - этот элемент считывает (мое предположение)).
Как от этого избавиться? try - catch не всегда спасает.
Цитата:
Originally posted by MVal
Есть у меня в приложении два "второстепенных" процеса (TThread-а). В одном - я полуычаю пакеты через IdTCPClient и укладываю их в очередь из TMemoryStream-ов. В другом - обрабатываю полученные данные (из этой очереди). После чего пишу их в другую очередь (тоже из TMemoryStream-ов) и первый процесс их отправляет.
Процессы зациклены и останавливаются только по дисконекту IdTCPClient-а.
Все бы было хорошо, но иногда возникает Acces violation (видимо при одновременном обращении из разных процессов если один пишет в очередь, а другой, в этот момент - этот элемент считывает (мое предположение)).
Как от этого избавиться? try - catch не всегда спасает.
Есть у меня в приложении два "второстепенных" процеса (TThread-а). В одном - я полуычаю пакеты через IdTCPClient и укладываю их в очередь из TMemoryStream-ов. В другом - обрабатываю полученные данные (из этой очереди). После чего пишу их в другую очередь (тоже из TMemoryStream-ов) и первый процесс их отправляет.
Процессы зациклены и останавливаются только по дисконекту IdTCPClient-а.
Все бы было хорошо, но иногда возникает Acces violation (видимо при одновременном обращении из разных процессов если один пишет в очередь, а другой, в этот момент - этот элемент считывает (мое предположение)).
Как от этого избавиться? try - catch не всегда спасает.
Мьютексы, критические секции и семафоры вам в руки
Цитата:
Originally posted by honeybeer
Мьютексы, критические секции и семафоры вам в руки
Мьютексы, критические секции и семафоры вам в руки
А пример можно, как правильно "семафорить"?
Цитата:
Originally posted by MVal
А пример можно, как правильно "семафорить"?
А пример можно, как правильно "семафорить"?
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.
Процесс №1
Код:
Процесс №2
Код:
.....
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
До тех пор, пока один из процессов не покинет крит. секцию, другой в нее не войдет и будет ждать (висеть).
Перед тем как это использовть, критическую секцию нужно создать
Код:
InitializeCriticalSection(&cs);
После того, как она станет ненужной, ее нужно убить
Код:
DeleteCriticalSection(&cs);
Объявление
Код:
CRITICAL_SECTION cs;
Цитата:
Originally posted by Jump
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.
Процесс №1
Процесс №2
До тех пор, пока один из процессов не покинет крит. секцию, другой в нее не войдет и будет ждать (висеть).
Перед тем как это использовть, критическую секцию нужно создать
После того, как она станет ненужной, ее нужно убить
Объявление
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.
Процесс №1
Код:
.....
//Далее выполняем обращение к некому ресурсу,
//не позволяющему многочтения...
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
//Далее выполняем обращение к некому ресурсу,
//не позволяющему многочтения...
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
Процесс №2
Код:
.....
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
//Тоже самое
EnterCriticalSection(&cs);
//код
LeaveCriticalSection(&cs);
//остальной код
До тех пор, пока один из процессов не покинет крит. секцию, другой в нее не войдет и будет ждать (висеть).
Перед тем как это использовть, критическую секцию нужно создать
Код:
InitializeCriticalSection(&cs);
После того, как она станет ненужной, ее нужно убить
Код:
DeleteCriticalSection(&cs);
Объявление
Код:
CRITICAL_SECTION cs;
Все понятно кроме одного, что вы с MVal подразумеваете под словом ПРОЦЕСС?
Цитата:
Originally posted by GIZMO
Все понятно кроме одного, что вы с MVal подразумеваете под словом ПРОЦЕСС?
Все понятно кроме одного, что вы с MVal подразумеваете под словом ПРОЦЕСС?
Ага мне тоже было интересно,так как 2 процесса не могут использовать для синхронизации критическую секцию,здесь придется использовать именованые мьютексы. Но судя по первому посту все же имелось ввиду поток а не процесс.
Цитирую: два "второстепенных" процеса (TThread-а)
Использую терминологию афтара ;)
Цитата:
Originally posted by Jump
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.
Если у тебя только два процесса, а главное ресурс допускает только одиночный доступ, то достаточно и критической секции.
Спасибо.
Как раз вот это я и хотел.
Цитата:
Originally posted by Jump
Первый пост читаем, да ;)
Цитирую: два "второстепенных" процеса (TThread-а)
Использую терминологию афтара ;)
Первый пост читаем, да ;)
Цитирую: два "второстепенных" процеса (TThread-а)
Использую терминологию афтара ;)
А поправить человека нельзя? Он до сих пор процесс от потока не отличает.