Перейти к содержанию
Fire Monkey от А до Я
  • 0

access violation TImage


kuldiegor

Вопрос

Всем доброго времени суток! Обнаружил проблему, связанную с загрузкой изображения в TImage.

Если загружать изображения с хард диска очень быстро, то как будто TImage не поспевает и вываливает access violation. Delphi xe7 Fire Monkey 64 bit Windows.

val:=round(360*value/max); //узнаём какова часть байт в градусах 
improgressbar.Bitmap.LoadFromFile(ExtractFilePath(paramstr(0))+'Pictures\ProgressBar\'+inttostr(val)+'.png');  
labprogressbar.Text:=strtool.intbytetostr(value,1)+'Б'+#$D#$A+'/'+#$D#$A+strtool.intbytetostr(max,1)+'Б';
Application.ProcessMessages; 
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Brovin Yaroslav, могу только догадываться...

Видимо там цикл по Value до max, поэтому чтоб надпись выводилась во время работы цикла. 

Этот отрывок кода не даёт представления где возникает ошибка.

kuldiegor, отладчиком проходили код? в какой строке ошибка?

Ссылка на комментарий
  • 0
uldiegor, отладчиком проходили код? в какой строке ошибка?

 

Да, ошибка в модуле FMX.Canvas.D2D. строка 2342 post-816-0-81902500-1455698970_thumb.png

В общем история такая отправляю файл через idhttp1 в событии OnIdHTTP1Work делаю прогрессбар сделанный из своих картинок. Всего 361 картинка (0-360) формата PNG. Провел небольшое тестирование в цикле ошибок нет, а вот с  idhttp1 вываливает. Похоже на то что bitmap не поспевает за idhttp1. Подскажите в чем может проблема и как её решить.

P.S. На VCL работает отлично.

P.S.S. 

 

 

Зачем здесь Application.ProcessMessages?

Что бы прога не подвисала. 

Ссылка на комментарий
  • 0

OnIdHTTP1Work случайно не в отдельном потоке работает?

Откажитесь от Indy, переходите на System.Net.*.pas

Точно сказать не могу, в общем, лежит на form1 idhttp компонент, а картинки грузятся на другой форме (form2)

P.S. У меня тоже такие подозрения были, возможно, без Synchronize вызывается событие

Изменено пользователем kuldiegor
Ссылка на комментарий
  • 0

А с инди сейчас все так плохо?

Пардон, а когда с ними было хорошо?

до 10 версии - постоянные проблемы с версиями OpenSSL.

В отличие от других компонентов влезть в код Indy, покопаться чтобы понять где возникает глюк - практически нереально, слишком много всего наворочено.

Да и взять самое простое - на кой idHTTP (который клиент) возбуждает исключение на коды 400-599 вместо того, чтобы просто отдать HTTPStatusCode  в ответе? В результате приходится городить многоэтажные конструкции try-except, что явно не способствует читабельности уже собственного кода.

Единственный плюс (который значим для меня, т.е. читать как имхо) у http-компонентов Indy - более-менее нормальная работа с multipart-form-data. В System.Net.Mime это немного недоработано, пришлось делать собственную надстройку.

 

P.S. на RadStudio Seattle Tour в СПб неофициально рекомендовали не использовать Indy, а действовать через System.Net.HttpClient

Изменено пользователем kami
Ссылка на комментарий
  • 0

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

Изменено пользователем kuldiegor
Ссылка на комментарий
  • 0

 

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

 

С TLabel ситуация точно та же.

Сначала BeginUpdate, потом EndUpdate.

А если проблема не в этом - тогда все (вывод в GUI) загнать в

TThread.Syncronize(TThread.CurrentThread, procedure
begin
 .................
end);

С мерцанием - не понял, что именно и когда мерцает?

Ссылка на комментарий
  • 0

 

 

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

 

С TLabel ситуация точно та же.

Сначала BeginUpdate, потом EndUpdate.

А если проблема не в этом - тогда все (вывод в GUI) загнать в

TThread.Syncronize(TThread.CurrentThread, procedure
begin
 .................
end);

С мерцанием - не понял, что именно и когда мерцает?

 

Огромнейшие спасибо! Всё работает и мерцание исчезло.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...