Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.036 c
1-1089785687
hgd
2004-07-14 10:14
2004.07.25
Как управлять программой голосом?


1-1089276204
Sandman25
2004-07-08 12:43
2004.07.25
Флаги или переопределение событий?


1-1089622430
pavel_pavel
2004-07-12 12:53
2004.07.25
Копирование объектов


1-1089613460
Pavelkq
2004-07-12 10:24
2004.07.25
OpenDialog для группы файлов


8-1083638047
тихий вовочка
2004-05-04 06:34
2004.07.25
Как избежать пропадания рисунка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский