powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация
4 сообщений из 4, страница 1 из 1
Синхронизация
    #32618172
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток !
Господа, просвятите плиз по следующему вопросу:
Есть у меня компонента, которая может писать в порт данные и читать из порта данные. На порту висит адаптер, имеет 4 линии. Переводит цифры в аналог в соответсвии с сигнализации линии к которой подключен. Линии связи не старндартные, что не суть важно. Важно следующее.
Кто-то, а именно мои клиенты этой комопнненты могут одновременно попытаться записать в порт данные. Сделал буфер. Пишу данные для отправки в буфер, поток читает.

Буфер организован так :
volatile long o_pW; // Для буфера данных указатель на записываемую строку
volatile long o_pR; // Для буфера данных указатель на читаемую в порт строку
BYTE szWriteBuffer[250][132]; //сам собственно говоря буфер
HANDLE hWriter; // Хендл для события о появлении данных для записи в
HANDLE hRunning; // Событие о нормальном выполнении команды, можно дальше писать

Чтение и запись бефера циклические, тоесть если o_pR или o_pW равны 250 то
на на начало буфера o_pW или o_pR установить в 0.
Признак пустого буфера o_pW = o_pR.

Запись:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL AddBufferOut(BYTE *cdata, int dwLength)
{
BOOL bRez = TRUE;
if(o_pW== 250 ) o_pW = 0 ;
SetEvent(hWriter); // Данные есть, сообщить потоку что можно читать
if (bRez != FALSE)
{
for(int i= 0 ; i<dwLength; i++)
{
szWriteBuffer[o_pW][i] = cdata[i]; //Записали команду 
}
o_pW++; // Сдвинулись на следующий элемент
}
return bRez;
// На переполнение не проверяю, скрость линии  50  Бод, скорость порта  4800  по опыту все успевает убежать без переполнения. 

Теперь запись в порт :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
DWORD WINAPI TReader (LPVOID pThreadParms)
{
HANDLE l_hCom=(HANDLE)ComPrm->hCom;
DWORD dwWritten = 0 ;
SetEvent (hWAIT[ 1 ]); // Уведомили процесс что поток стартовал
 while(bFlagRun)
	 {
BOOL bRez = TRUE;
if(o_pR ==  250 )  o_pR = 0 ;
if(o_pR == o_pW) // Буфер пуст
{
	ResetEvent(hWriter);
	WaitForSingleObject(hWriter, INFINITE); // Ждем собитие появления данных в буфере
}

DWORD dwWritten= 0 ;
if (!WriteFile(l_hCom,&szWriteBuffer[o_pR][ 0 ],(DWORD)szWriteBuffer[o_pR][ 3 ]+ 6 ,&dwWritten,&l_osWrite)) // Тут нормально все записывает
{
if (GetLastError()== ERROR_IO_PENDING)
{
 WaitForSingleObject(l_osWrite.hEvent,  5000 );
GetOverlappedResult(l_hCom, &l_osWrite, &dwWritten, FALSE); 
}
else { CancelIo(l_hCom);  dwWritten= 0 ;}
}
ResetEvent(l_osWrite.hEvent);
o_pR++;
ResetEvent(hRunning);
WaitForSingleObject(hRunning,INFINITE); // Ждем   ответа о выполенинии
}
return  dwWritten;
}

Вопросы следующие:
1. Как мне сихронизировать индексы записи и чтения ? Тоесть как мне достоверно знать что что лежит в o_PW и o_RW ? Ведь во время чтения или записи индекс может изменяться в одном потоке , а во втором проверяться что там лежит. Как быть ?

2. Как сихронизировать сообщения к клиенту. Допустим есть таких компонент 4..5..., а клиент 1. И все они должны вернуть прочитанные из порта данные ему ?
Буду признателен за ответы !
...
Рейтинг: 0 / 0
Синхронизация
    #32618212
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ну в таких случаях вроде полагается использовать mutex, т.е. для предотвращения одновременного доступа к объекту из разных потоков.

2. Пусть клиент регулярно опрашивает компоненты на предмет появления новыех данных.
...
Рейтинг: 0 / 0
Синхронизация
    #32618288
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А критические секции не прокатят ?
2. У меня компонента сама при появлении данных выполняет метод клиента, и что делать если из портов из 5 портов одновременно щимятся данные ?
...
Рейтинг: 0 / 0
Синхронизация
    #32619238
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luser
1. А критические секции не прокатят ?

Mutex - это способ физической реализации критических секций
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]