Форум: "Основная";
Текущий архив: 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.04 c