Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2017, 22:43   #1
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
Восклицание Баг с передачей изображения.

Доброго времени суток всем. Подскажите пожалуйста, найти баг.

При отправке с одного компьютера из 5-ти, изображение приходит не полностью, а именно, кусок, то беж на изображении видно часть иконок верхнего левого угла, а панели задач и трей не видно такое ощущение, что приходит 800x600 из 2000x1000, только на одной машине данная история ниже приложу получение передачу и приём stream.

Критикуйте код, но помогите пожалуйста.

Передача:
Код:
var
  SImg: TMemoryStream;
  Bmp: TBitmap;
  JpegIm: TJpegImage;
begin
  try
    SImg := TMemoryStream.Create;
    Bmp := TBitmap.Create;
    try
      Bmp.Width := GetDeviceCaps( GetDC(0), HORZRES );     //
      Bmp.Height := GetDeviceCaps( GetDC(0), VERTRES );   //GetDeviceCaps( GetDC(0), VERTRES )
      BitBlt( Bmp.Canvas.Handle, 0, 0, GetDeviceCaps( GetDC(0), HORZRES ), GetDeviceCaps( GetDC(0), VERTRES ),
             GetDC( 0 ), 0, 0,SRCCOPY );
      JpegIm := TJpegImage.Create;
      JpegIm.Assign( Bmp );
      JpegIm.CompressionQuality := uClient.Compress;
      JpegIm.Compress;
      SImg.Position := 0;
      JpegIm.SaveToStream( SImg );
      SImg.Position := 0;
      TCPClientScreen.IOHandler.Write( SImg, SImg.Size, False );
    finally
      SImg.Clear;
      FreeAndNil( Bmp );
      FreeAndNil( JpegIm );
      FreeAndNil( SImg );
    end;
  except
    //Добавить
  end;
end;
Приём:
Код:
var
  SImg: TMemoryStream;
  JpegIm : TJPEGImage;
begin
  SImg := TMemoryStream.Create;
  JpegIm := TJPEGImage.Create;
  try
    Inc( i );
    SImg.Position := 0;
    AContext.Connection.IOHandler.ReadStream( SImg, SImg.Size, True );
    lblTestSize.Caption := IntToStr( SImg.Size );
//    SImg.Position := 0;
//    SImg.SaveToFile( ExtractFileDir( ParamStr( 0 ) ) + '\img\' + IntToStr( i ) + '.jpg' );
    SImg.Position := 0;
    JpegIm.LoadFromStream( SImg );
    fGetScreen.imgScreen.Picture.Bitmap.Assign( JpegIm );
    fGetScreen.lblSizeImg.Caption := 'Размер изображения - ' +
      IntToStr( SImg.Size div 1024 ) + '0 Кбайт';
  finally
    FreeAndNil( SImg );
    FreeAndNil( JpegIm );
    AContext.Connection.IOHandler.Free;
  end;
end;
Изображения
Тип файла: jpg 1.jpg (115.6 Кб, 136 просмотров)
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 10.10.2017, 13:21   #2
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

забыл добавить приложение стартует от службы, может ли это как-то влиять? Т.к. тестил с обычным приложением всё отрабатывает хорошо.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 10.10.2017, 15:17   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

А там не два монитора случайно?
Black Fregat вне форума Ответить с цитированием
Старый 10.10.2017, 15:28   #4
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А там не два монитора случайно?
Нет, там один монитор, ноутбук, но судя по всему мне тут никто не поможет, разве что в теории.

Написал точно такое же приложение ctrl+c ctrl+v код из того, что есть, только оно запускается и делает снимок, так вот там всё норм.

История такая, что я делаю скрин в потоке и предварительно запускается программа от службы( то есть служба запускает приложение ), при отправке проверял битмап, он размера именно, того что нужно, но сохраняешь в файл на стороне клиента и всё равно белеберда.

Странно, что вообще приходит или сохраняет, написал бы ошибку какую нибудь.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 10.10.2017, 16:54   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
то беж на изображении... Критикуйте код
А заодно и подачу материала
То бишь, а не "то беж"...
kropotkina-alice вне форума Ответить с цитированием
Старый 10.10.2017, 17:03   #6
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А заодно и подачу материала
То бишь, а не "то беж"...
Но радАсть тиби я ещи бальши нопешу ашебак, лешь би памагла.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 11.10.2017, 12:24   #7
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Попробуйте Screen.Width, а не GetDeviceCaps(HORZRES).

После GetDC() нужно релизить HDC обязательно! Иначе утечки памяти неизбежны.

Также у вас JpegIm не в том месте удаляется, нужно сделать отдельный блок try/finally для него иначе опять будут утечки памяти.

Последний раз редактировалось Alex11223; 11.10.2017 в 12:30.
dummy_user вне форума Ответить с цитированием
Старый 12.11.2017, 16:31   #8
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
При отправке с одного компьютера из 5-ти, изображение приходит не полностью
Все правильно что изображение не полностью приходит, в приеме нужно делать так сказать накопительный буфер иногда данные кусками идут при перегрузе например сокета, когда в него все данные поступят тогда и выводить результат в процедуре если есть WorkEnd или по истечении допустим времени уже простоя или проверку на размер принятых данных ну или по своей метке конца принятых данных.

Последний раз редактировалось Aliens_wolfs; 12.11.2017 в 16:56.
Aliens_wolfs вне форума Ответить с цитированием
Старый 12.11.2017, 16:48   #9
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Все правильно что изображение не полностью приходит, в приеме нужно делать так сказать накопительный буфер иногда данные кусками идут при перегрузе например сокета, когда в него все данные поступят тогда и выводить результат по истечении допустим времени уже простоя или проверку на размер принятых данных ну или метку конца принятых данных.
Нет ты не понял, это проявилось на 1-ой только машине, я не идиот и перезапускал и клиент и сервер, это наблюдается всегда, почему-то размеры экрана задавались ложными и пришлось для конкретной машины, прописывать константами.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 12.11.2017, 17:02   #10
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Странно, обычно бывает то что я описал, а что за винда на той машине где проблема была? Это так для любопытства
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения. s-mumrik Visual C++ 3 12.04.2013 21:21
Проблемы с передачей праведный HTML и CSS 4 10.05.2012 11:59
Чат с передачей изображения на Java kestugar Помощь студентам 3 28.11.2011 19:11
Проблема с передачей( фтпуд17 Свободное общение 5 27.01.2011 11:23
Проблема с передачей куки arwm Работа с сетью в Delphi 7 28.12.2007 23:44