![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с компонентами TidTCPServer и TidTCPClient [D7, WinXP]
maxistent © (2009-11-30 06:57:00)Доброго времени суток. Подскажите как правильно использовать компоненты TidTCPServer и TidTCPClient для передачи данных? На сервере в OnExecute можно просто сделать что-то вроде AThread.Connection.ReadBuffer(Data,DataSize)? или надо как-то по-особому обрабатывать этот эвент? Собственно проблема вот в чем: пишу софт для передачи картинки с экрана в реалтайме (ну или почти в реалтайме). Получилось что-то вроде этого:
с клиента передаю данные idTcpClient1.WriteBuffer(...);
на сервере принимаю так:
procedure TForm1.ss1Execute(AThread: TIdPeerThread);
var
buf1,buf2:pointer;
DataSize:integer;
st:TStream;
jpg:TJPEGImage;
r:TRect;
begin
AThread.Connection.ReadBuffer(DataSize,sizeof(DataSize));
AThread.Connection.ReadBuffer(r,sizeof(r));
GetMem(buf1,DataSize);
AThread.Connection.ReadBuffer(buf1^,DataSize);
st:=TMemoryStream.Create;
st.Write(buf1^,DataSize);
FreeMem(buf1,DataSize);
st.Position:=0;
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(st);
st.Free;
image1.Picture.Bitmap.Canvas.draw(r.Left,r.Top,jpg);
jpg.Free;
end;
При подключении начинается передача изображения, но через несколько секунд (~5 сек) изображение перестает обновляться, а еще через несколько секунд прога "вылетает" с сообщением <Canvas does not allow drawing>. что здесь не так? не могу понять...
CrytoGen (2009-11-30 08:41:00) [41]
l:=TCPTranslation.Threads.LockList;
for i:=0 to l.Count-1 do
begin
TIdPeerThread(l.Items[i]).Connection.WriteBuffer(...);
// TIdPeerThread(l.Items[i]).Connection.Disconnect;
end;
TCPTranslation.Threads.UnlockList;
а на клиенте необходимо создать поток и читать в нём.
brother (2009-11-30 08:39:00) [42]> На сервере нужно всем клиентамрассылать команды
и
> как организовать двухстороннюю связь
О_о
для клиента связь: клиент- сервер (сеанс),
для сервера: сервер (сеансы) - много клиентов
?
maxistent (2009-11-30 08:14:00) [43]Вообще не могу понять, как организовать двухстороннюю связь с помощью этих компонентов? На сервере нужно всем клиентам рассылать команды, а как это сделать - не знаю :( пробывал вызвать
idTCPServer.bindings.items[i].Send(buf,x,0)
но как тогда на клиентах принять эти данные - не пойму..
пробывал на клиенте создать отдельный поток и в нем вызывать
idTCPClient.ReadBuffer(buf,x)
но данные туда не приходють :(
что делать - не знаю.. нигде толком не объясняют как организовать непрерывную двухстороннюю связи сервера с несколькими клиентами.
Помогите, хто чем может, плииииз!
maxistent (2009-11-30 07:21:00) [44]Блин, протупил =)) решил проблему двумя дополнительными строчками кода:
image1.Picture.Bitmap.Canvas.Lock;
image1.Picture.Bitmap.Canvas.draw(r.Left,r.Top,jpg);
image1.Picture.Bitmap.Canvas.UnLock;
Вроде работает...
Остался только вопрос по поводу правильности обработки эвента OnExecute - правильный он у меня или все-таки нет?