![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки (Thread)
sdw_syscoder © (2004-08-02 01:24:00)Задача откровенно говоря несложная. Вообщем есть два потока. Сначала запускаем FirstThread, затем после его завершения нужно запустить SecondThread (описания этих классов находятся в разных юнитах). Как это сделать практически?
sdw_syscoder (2004-08-03 18:37:00) [1]> Erik1 (03.08.04 10:31) [42]
> Вобщем все просто:
Просто - это когда разберёшся, а я пока c этим методом не знаком.
А что вы думаете по поводу следующей мысли >>>
Если сделать так: принимать данные таким же методом и писать их в чистом виде в файл, а затем в stream/thread потоке обрабатывать и через функцию LoadFromFile выводить в RichEdit.
Erik1 (2004-08-03 10:31:00) [2]Вобщем все просто:
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-02 17:24:00) [3]Ладно, хватит пока демогогии. Уже по ходу пустой базар пошел. Надо начинать уму разуму набираться.
Всех благодарю за приятную беседу и прошу эту ветку взять на карандаш, я ещё не закончил.
К завтрому наверное выясню и разберусь, вот тогда и поговорим.
Anatoly Podgoretsky (2004-08-02 17:22:00) [4]sdw_syscoder (02.08.04 17:20) [39]
Говори спасибо, что не IPC или COM сервер
sdw_syscoder (2004-08-02 17:20:00) [5]> Anatoly Podgoretsky © (02.08.04 17:07) [37]
Внатури, глаза разбегаются с чего начинать, я с Thread-ом ещё не до конца разобрался, а тут трубы подогнали... Вот гемморой-то а-а-а?
> Erik1 (02.08.04 16:59) [36]
У меня стояла аналогтчная задача. Я сичтывал кусками и записывал в pipe...
Т-а-а-к... Я балдею! Что ещё за ПИПЕ? Ха-ха! Может примерчик свой аналогичный подкинете, а то я "сечку" весь день жру.
Digitman (2004-08-02 17:20:00) [6]
> ваще впервые слышу об FIFO
если ты в 1-й раз слышишь о стримах, об PostMessage(), то не лучше ли отказаться на время от задачи, вызывающей на сей день массу непонятностей и явно непосильной тебе, взять соотв.литературу и внимательно почитать ее ?
Anatoly Podgoretsky (2004-08-02 17:07:00) [7]Так совсем мужика запутали, теперь еще и про трубы узнавать :-)
Erik1 (2004-08-02 16:59:00) [8]У меня стояла аналогтчная задача. Я сичтывал кусками и записывал в pipe великолепная вещь для таких случиев. Когда блок будет принят записывай его в буфер и передавай в форму PostMessage() Память под буфер можно выделять через GetMem а указатель передавать в PostMessage, при принятии незабудь очистить память и занести в memo.
sdw_syscoder (2004-08-02 16:41:00) [9]> Digitman © (02.08.04 16:28) [34]
Ну ты и загнул, я ваще впервые слышу об FIFO-очереди, где-нибудь можно вычитать формулировку?
> KSergey © (02.08.04 16:26) [33]
Уважаемый KSergey ©, не знаю как Вам, а по-моему после [34] постера уже понятно что к чему и в каком направлении идти.
Но я всё-таки попробую переписать код под Thread-овский поток, а после буду разбираться со Stream-овским.
Digitman (2004-08-02 16:28:00) [10]
> sdw_syscoder
считай, что стрим - это та же FIFO-очередь: данные поступают разными порциями в ее хвост, а выбираются нужными порциями из головы ... это как раз то что тебе нужно по логике, коль речь зашла о "кусках"
KSergey (2004-08-02 16:26:00) [11]Нифига, похоже, не проясняется...
Если нельзя сравнить - как можно сказать когда лучше?? Из чего лучше сделать деревянный стол: из апельсинов или автобуса? Вот так бы я переформулировал этот вопрос. Надеюсь, теперь его абсурдность понятна?
Вы про них просто прочитайте
Зачем здесь просить пересказ статей, коих в инете навалом. И в книгах.
sdw_syscoder (2004-08-02 16:20:00) [12]Если сравнивать нельзя, то скажите в каких случаях использовать stream, а в каких thread.
sdw_syscoder (2004-08-02 16:18:00) [13]> KSergey © (02.08.04 16:04) [30]
Наконец-то ситуация проясняется... Та-а-а-а-к... Ща разберёмся...
Кто не с нами, тот под нами.
KSergey (2004-08-02 16:04:00) [14]stream - потоки ввода-вывода
thread - кодовые потоки
Сравнивать их лучше/хуже нельзя... Это как автобус и апельсин.
KSergey (2004-08-02 16:03:00) [15]> [27],[27] sdw_syscoder
Опа, хороший вопрос... своевременный....
Может вы изначально не за те потоки схватились??
sdw_syscoder (2004-08-02 16:01:00) [16]Удалено модератором
sdw_syscoder (2004-08-02 15:59:00) [17]А в чём отличие и преимущество потока stream от thread?
Digitman (2004-08-02 15:01:00) [18]
> преобразование построено так, что работает оно только тогда,
> когда данные приняты полностью, а не кусками
ну и буферизуй принимаемые "куски" в один последовательный поток (в дан.случае поток = stream, а не thread) входящих данных ! При каждом приеме анализируй, не содержит ли уже вх.поток целостных данных для обработки, и если содержит, то извлекай их из потока и обрабатывай тут же
> через синхронизатор
я не понимаю, на кой ляд тебе в этом случае "синхронизатор" ... что с чем ты будешь синхронизировать ?
sdw_syscoder (2004-08-02 14:55:00) [19]> Sha © (02.08.04 14:35) [22]
>а кто такой Thread как узнал?
Естевственно из классической литературы, ну и там... из Инета(в основном). Лень что-то искать про пост-мессаги и так уже опух.
> Digitman © (02.08.04 14:39) [23]
> мне вот вообще непонятно, зачем здесь нужно огород городить с несколькими доп.трэдами и синхронизацией между ними
На счёт этого замечания я тоже согласен, только вот преобразование построено так, что работает оно только тогда, когда данные приняты полностью, а не кусками.
> достаточно одного доп.трэда, который будет циклически ожидать/считывать из порта данные по мере их поступления и тут же обрабатывать их
Ну допустим, а тогда где производить преобразования, в методе Execute или через синхронизатор в процедуре DoRead?
Sha (2004-08-02 14:45:00) [20]Digitman © (02.08.04 14:39) [23]
Согласен.
Такое требуется только если читающие треды чужие и их несколько.