Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизПотоки (Thread) Найти похожие ветки
← →
Anatoly Podgoretsky © (2004-08-02 17:22) [40]sdw_syscoder (02.08.04 17:20) [39]
Говори спасибо, что не IPC или COM сервер
← →
sdw_syscoder (2004-08-02 17:24) [41]Ладно, хватит пока демогогии. Уже по ходу пустой базар пошел. Надо начинать уму разуму набираться.
Всех благодарю за приятную беседу и прошу эту ветку взять на карандаш, я ещё не закончил.
К завтрому наверное выясню и разберусь, вот тогда и поговорим.
← →
Erik1 (2004-08-03 10:31) [42]Вобщем все просто:
if Not CreatePipe(hRead,hWrite,nil,MaxPipiSize) Then begin
ShowMessage("Not create Pipe"); //создание pipe
Это чтение данных:
procedure TCommon.Receive(Sender: TObject; Count: Integer);
Var Buffer: Pointer;
Bytes : Integer;
ByteWrite: DWord;
begin
if (PipeSize + Count) > MaxPipiSize then
begin
ExitProg(self);
Exit;
end;
GetMem(Buffer, TComm(Sender).ReadBufSize);
try
Bytes := TComm(Sender).Read(Buffer^, Count);
if Bytes = -1 then FShowStatus.NewEvent(stErrorCheck)
else begin
FSection.Enter;
WriteFile(hWrite,Buffer^,Bytes,ByteWrite,nil);
Inc(PipeSize, ByteWrite);
FSection.Leave;
FEvent.SetEvent;
if Assigned(InfoControl) Then
InfoControl.CommRecive(Buffer, Bytes);
end;
Application.ProcessMessages;
finally
FreeMem(Buffer);
end;
end;
Это считывание из pipe:
procedure WriteBase.CustomRead(Size: Word);
begin
FSection.Enter;
ReadFile(hRead,PChar(IntBufer)^,Size,LastLen,nil);
Dec(PipeSize,LastLen);
FSection.Leave;
Buffer := Buffer + Copy(IntBufer,1,LastLen);
End;
procedure WriteBase.PortionRead;
Var CurRead: Word;
begin
CurRead := Alllen-Length(Buffer);
if (PipeSize < CurRead) And ((LastLen < Alllen) or (PipeSize=0)) then CloseFileSystem
else CustomRead(CurRead);
End;
Разумеется считывание работает в Thread
procedure WriteBase.Execute;
Label Read, Back;
begin
if LastSize < 0 Then begin
raise Exception.Create("Not correct stantion seting, thread trminate!");
Exit;
end;
Read:
if Terminated Then begin
SaveLast;
Exit;
end;
Back:
if FEventData.WaitFor($FFFFFFFF) = wrTimeout then GoTo Back;
PortionRead;
if Length(Buffer) < AllLen then Goto Read;
CheckString;
if FlagErr Then Goto Read;
ProgStatus := trWork;
WriteDecodeString;
goto Read;
end;
Это вырезки из старого проекта.
← →
sdw_syscoder (2004-08-03 18:37) [43]> Erik1 (03.08.04 10:31) [42]
> Вобщем все просто:
Просто - это когда разберёшся, а я пока c этим методом не знаком.
А что вы думаете по поводу следующей мысли >>>
Если сделать так: принимать данные таким же методом и писать их в чистом виде в файл, а затем в stream/thread потоке обрабатывать и через функцию LoadFromFile выводить в RichEdit.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.025 c