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

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

Проблема с компонентами TidTCPServer и TidTCPClient [D7, WinXP]


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

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 - правильный он у меня или все-таки нет?


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

Наверх

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