Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Обработка данных, приходящих по сокету в отдельном потоке   Найти похожие ветки 

 
sapsi   (2004-07-14 10:56) [0]

Как грамотно передать обработку информации и вывод ее на экран в другой поток, т.е. обработатьClientSocketRead в другом потоке, вывести результаты на форму главного потока.
Спасибо.


 
Анонимщик ©   (2004-07-14 11:04) [1]

Synchronize, вероятно, вполне подойдет. Если не подойдет, то данные можно переслать с помощью SendMessage либо главному окну, либо PostThreadMessage - какому-нибудь другому потоку


 
sapsi   (2004-07-14 11:20) [2]

спасибо
И как это будет выглядеть в моем случае?

Например, в главном потоке:
procedure Tmainfrm.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin

s:=socket.ReceiveText;
p:=s;
memo1.lines.add(s);
...................
и т.п.

end;
В отдельном потоке

procedure tmythread.Execute;
begin

что здесь, чтобы выполнить  

s:=socket.ReceiveText;
(или s:=mainfrm.clientsocket1.socket.ReceiveText;)
p:=s;
memo1.lines.add(s);
...................
и все остальное
и сразу отобразить результаты, например, в мемо?

end;


 
Digitman ©   (2004-07-14 11:21) [3]


> приходящих по сокету


и к чему этот комментарий именно насчет сокетов ?
совершенно непринципиально, откуда и каким образом черпаются данные для дальнейшей обработки


 
Digitman ©   (2004-07-14 11:24) [4]


> sapsi


у тебя доп.поток еще чем-то занимается, кроме как работой с гнездом ?  если нет, то накой шут неблок.режим выбран ?


 
sapsi   (2004-07-14 11:38) [5]

2 Digitman ©   (14.07.04 11:21) [3]
Просто именно конкретная ситуация. По сокету постоянно приходят данные, думаю, однопоточная программа не успевает их обработать должным образом, так как обрабатывает еще нажатия клавиш в основном потоке.
Когда не обрабатывает нажатия, то все данные обрабатываются хорошо.
2 Digitman ©   (14.07.04 11:24) [4].
Я хотел бы для, чтобы доп. поток больше ничем не занимался, не могу грамотно это оформить к в коде. Можно ли при событии ClientRead каждый раз из основного потока обращаться ко второму потоку для разбора данных или лучше полностью ClientRead вместе с выводом данных сделать во втором потоке?
Что даст блокирущий режим?
Поможет ли решить мою проблему?
Спасибо.


 
Анонимщик ©   (2004-07-14 11:50) [6]

В шреде обяви процедуру
TextToMemo и переменную (в потоке же) s, куда будешь данные пихать: s:=socket.ReceiveText;
После этого вызывай Synchronize(TextToMemo), а она сама выглядит так:
procedure TextToMemo;
begin
 Memo1.Lines.Add(s);  
end;

Но! Это тебе понадобиться только в том случае, когда ты действительно получаешь данные в дополнительном потоке (ты в каком месте кода сокет открываешь?). Во-вторых, все ты успеешь, со своим тестом-то. В третьих, слишком уж простая обработка у тебя. В разделе "Статьи" есть статьи о сокетах, так они могут с толку сбить.


 
sapsi   (2004-07-14 11:57) [7]

Обработка - как пример.
"Во-вторых, все ты успеешь, со своим тестом-то. В третьих, слишком уж простая обработка у тебя."
на самом деле, передаются координаты графического, который помещается в определенное место экрана. ТОлько эти координаты приходят не теми блоками, которыми отсылаются, а "склеенными". У меня эти блоки успешно разделяются и все прорисовывается и затирается как надо, вот только когда добавляется обработка клавиатуры в основном потоке, прорисовываться и затираться начинает не все.


 
Оши   (2004-07-14 12:00) [8]

Ндык юзай beginthread/ex

в чем проблема ?!


 
Digitman ©   (2004-07-14 12:04) [9]


> Что даст блокирущий режим?


в дан.случае значительно упрощает работу с гнездом


> Можно ли при событии ClientRead


в блок.режиме забудь об этом событии

var
//глоб.переменные
 ms: TMemoryStream;
 cs: TCriticalsection;
..

procedure tmythread.Execute;
const
 BufSize = 4096;
var
 p: Pointer;
 PrevPos, BytesRead: Integer;  
begin
try
  GetMem(p, BufSize);
  try
   with ClientSocket.Socket do
    while not Terminated and Connected do
     begin
       BytesRead := ReceiveBuf(p^, BufSize);
       if BytesRead > 0 then
         begin
           cs.Enter;
           try
             PrevPos := ms.Position;
             ms.Position := ms.Size;
             ms.WriteBuffer(p, BytesRead);
             ms.Position := PrevPos;
             PostMessage(хэндл_формы, TM_NEWDATA_RECEIVED, BytesRead, 0);
           finally
             cs.Leave;
           end;
         end;
     end;
  finally
    GreeMem(p);
  end;
except
end;
end;

...

procedure TMyForm.MsgNewDataRecvd(var Message: TMessage); //TM_NEWDATA_RECEIVED message handler
begin
cs.Enter;
 try
  ... обработка данных в стриме ms
 finally
   cs.Leave;
 end;
end;


 
sapsi   (2004-07-14 13:20) [10]

Спасибо



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1089701869
Vilux
2004-07-13 10:57
2004.07.25
BalloonHint


9-1080207016
GrayFace
2004-03-25 12:30
2004.07.25
Преимущества DirectX перед Canvas + TBitmap.ScanLine


6-1085734986
Phantom
2004-05-28 13:03
2004.07.25
Как пропинговать ряд компьютеров


1-1089127014
Buster
2004-07-06 19:16
2004.07.25
Как написать у CheckBox текст в две строки?


1-1089290665
Oleg_
2004-07-08 16:44
2004.07.25
Как узнать версию IE