Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки (Thread)


Страницы:   1 2 3

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]

Согласен.
Такое требуется только если читающие треды чужие и их несколько.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо