Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

IfAssigned(FInterimBuf) then





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

result := 1

Else

result := 0;

LeaveCriticalSection(FDataSection);

end;

 

{ Buffer error handling needs to be discussed }

procedureTBAWriterThread.Execute;

Var

Temp: Pointer;

 

Begin

While notTerminated do

Begin

DataFlow;

WaitForSingleObject(FIdleSemaphore, INFINITE);

EnterCriticalSection(FDataSection);

Temp := FInterimBuf;

FInterimBuf := nil;

LeaveCriticalSection(FDataSection);

if notFBuffer.PutItem(bsSideA, Temp) thenTerminate;

end;

end;

 

functionTBAWriterThread.WriteItem(Item: Pointer): boolean;

Begin

result := false;

EnterCriticalSection(FDataSection);

If notAssigned(FInterimBuf) then

Begin

FInterimBuf := Item;

result := true;

end;

LeaveCriticalSection(FDataSection);

ifResult thenReleaseSemaphore(FIdleSemaphore, 1, nil);

end;

 

procedureTBAReaderThread.Execute;

Var

Temp: Pointer;

 

Begin

While notTerminated do

Begin

Temp := FBuffer.GetItem(bsSideA);

IfAssigned(Temp) then

Begin

EnterCriticalSection(FDataSection);

FInterimBuf := Temp;

LeaveCriticalSection(FDataSection);

DataFlow;

WaitForSingleObject(FIdleSemaphore, INFINITE);

End

elseTerminate;

end;

end;

 

functionTBAReaderThread.ReadItem: pointer;

Begin

EnterCriticalSection(FDataSection);

result := FInterimBuf;

LeaveCriticalSection(FDataSection);

ifAssigned(Result) thenReleaseSemaphore(FIdleSemaphore, 1, nil);

end;

 

procedureTBlockToAsyncBuf.MessageHandler(varMsg: TMessage);

Begin

if(Msg.Msg = WM_BLOCK_ASYNC) then

Begin

CaseTThreadNotify(Msg.LParam) of

tnReaderDataflow: Read;

tnWriterDataflow: Write;

Else

Assert(false);

end;

end;

end;

 

procedureTBlockToAsyncBuf.ReaderDataFlow(Sender: TObject);

Begin

PostMessage(FHWND, WM_BLOCK_ASYNC, 0, Integer(tnReaderDataflow));

end;

 

procedureTBlockToAsyncBuf.WriterDataFlow(Sender: TObject);

Begin

PostMessage(FHWND, WM_BLOCK_ASYNC, 0, Integer(tnWriterDataflow));

end;

 

procedureTBlockToAsyncBuf.Read;

Begin

ifAssigned(FOnRead) thenFOnRead(Self);

end;

 

procedureTBlockToAsyncBuf.Write;

Begin

ifAssigned(FOnWrite) thenFOnWrite(Self);

end;

 

constructorTBlockToAsyncBuf.Create(AOwner: TComponent);

Begin

inheritedCreate(AOwner);

FHWND := AllocateHWnd(MessageHandler);

FBuffer := TBiDirBuf.Create;

FBuffer.Size := InternalBufferSize;

FReaderThread := TBAReaderThread.Create(true);

FReaderThread.Buffer := Self.FBuffer;

FReaderThread.OnDataFlow := ReaderDataFlow;

FWriterThread := TBAWriterThread.Create(true);

FWriterThread.Buffer := Self.FBuffer;

FWriterThread.OnDataFlow := WriterDataFlow;

FReaderThread.Resume;

FWriterThread.Resume;

end;

 

procedureTBlockToAsyncBuf.ResetState;

Begin

ifAssigned(FReaderThread) thenFReaderThread.Terminate;

ifAssigned(FWriterThread) thenFWriterThread.Terminate;

FBuffer.ResetState;

FReaderThread.Free;

FWriterThread.Free;

FReaderThread := nil;

FWriterThread := nil;

end;

 

destructorTBlockToAsyncBuf.Destroy;

Begin

{ A few destruction subtleties here }

ResetState;

FBuffer.Free;

DeallocateHWnd(FHWND);

inheritedDestroy;

end;

 

functionTBlockToAsyncBuf.BlockingRead: pointer;

Begin

result := FBuffer.GetItem(bsSideB);

end;

 

functionTBlockToAsyncBuf.BlockingWrite(Item: pointer): boolean;

Begin

result := FBuffer.PutItem(bsSideB, Item);

end;

 

functionTBlockToAsyncBuf.AsyncRead: pointer;

Begin

result := FReaderThread.ReadItem;

end;

 

functionTBlockToAsyncBuf.AsyncWrite(Item: pointer): boolean;

Begin

result := FWriterThread.WriteItem(Item);

end;

 

functionTBlockToAsyncBuf.GetItemsInTransit: integer;

Var

Entries: integer;

 

Begin

result := FReaderThread.ItemsInTransit + FWriterThread.ItemsInTransit;

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.