Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Синхронизация / 4 сообщений из 4, страница 1 из 1
23.07.2004, 10:44
    #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
23.07.2004, 10:55
    #32618212
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация
1. Ну в таких случаях вроде полагается использовать mutex, т.е. для предотвращения одновременного доступа к объекту из разных потоков.

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

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


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