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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2012, 22:05   #1
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Восклицание Загрузка Image через idHTTP в TThread

Не пойму что тут не так, уже часа 2 голову морочу, ткните носом что тут не так!

Вызываю так!
Код:
procedure TForm2.Button1Click(Sender: TObject);
var
  NewThread: TThrd;
begin
  NewThread := TThrd.Create(True);
  NewThread.FreeOnTerminate := True;
  try
    NewThread.Url:='http://upload.wikimedia.org/wikipedia/ru/thumb/c/c5/JPEG_example_down.jpg/350px-JPEG_example_down.jpg';
    NewThread.Image:=image1;
    NewThread.DefaultImage:=image2;
    NewThread.Resume;
  except on EConvertError do
    begin
      NewThread.Free;
      ShowMessage('error!');
    end;
  end;
end;
Сам юнит потока

Код:
unit Unit3;

interface

uses
  Classes,ExtCtrls,SysUtils;

type
  TThrd = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure loadImage;
  Public
    Url:string;
    image,DefaultImage: Timage;
  end;

implementation
uses
JPEG,IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

procedure TThrd.loadImage;
var
  MS:TMemoryStream;
  pic: TJPEGImage;
  HTTP: TIdHTTP;
begin
try
  http:=TIdHTTP.Create(nil);
  MS:=TMemoryStream.Create;
  pic:= TJPEGImage.Create;
  try
    HTTP.Get(url,MS);
    MS.Position:=0;
    image.Picture.Assign(pic);
    DefaultImage.Visible:=false;
    image.Visible:=true;
  except
    on e:Exception do
    begin
      image.Visible:=false;
      DefaultImage.Visible:=true;
    end;
    end;
finally
  freeandnil(http);
  freeandnil(MS);
  freeandnil(pic);
end;
end;

procedure TThrd.Execute;
begin
  Synchronize(loadImage);
end;

end.
Проблема тут именно в потоке ! Процедура без потока работает на ура !

Последний раз редактировалось fucil; 06.09.2012 в 22:09.
fucil вне форума Ответить с цитированием
Старый 06.09.2012, 22:13   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

а что не так?
Человек_Борща вне форума Ответить с цитированием
Старый 06.09.2012, 22:16   #3
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Восклицание

Вываливает Access vioation at address 004185CB in module "Project1.exe" . Read of address 00000000

вот скрин http://pix.am/yaxv
fucil вне форума Ответить с цитированием
Старый 06.09.2012, 22:40   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

и правильно.
Код:
    image,DefaultImage: Timage;
что-то я не вижу кода, который создает эти 2 контейнера изображений.
Человек_Борща вне форума Ответить с цитированием
Старый 06.09.2012, 22:43   #5
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию а это как ?

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
и правильно.
Код:
    image,DefaultImage: Timage;
что-то я не вижу кода, который создает эти 2 контейнера изображений.
я наверное ещё с этим не встречался про что ты ? можно пример хоть малейший !
я же по ссылке передал image

Код:
  NewThread.Image:=image1;
  NewThread.DefaultImage:=image2;
fucil вне форума Ответить с цитированием
Старый 06.09.2012, 22:51   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

хм, ну тогда поток стартует раньше чем получает заветные
NewThread.Image:=image1;
NewThread.DefaultImage:=image2;

либо что-то ещё. Ставь бряк на начало кода потока и трассируй отладчиком до ошибки.
Иначе можно гадать вечно.

Но обращание в пустоту определенно намекает, что стучимся в не существующую дверь.
Человек_Борща вне форума Ответить с цитированием
Старый 06.09.2012, 23:04   #7
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
Восклицание делал в том то и беда что я уже вечер мозг парю

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
хм, ну тогда поток стартует раньше чем получает заветные
NewThread.Image:=image1;
NewThread.DefaultImage:=image2;
Не может быть смотри

Код:
NewThread := TThrd.Create(True); //запускаю поток в приостановленном режиме !!!
    NewThread.FreeOnTerminate := True; //самовыгрузка в конце потока 
    NewThread.Url:='http://upload.wikimedia.org/wikipedia/ru/thumb/c/c5/JPEG_example_down.jpg/350px-JPEG_example_down.jpg'; //инициализация поля url
    NewThread.Image:=image1; //инициализация первого поля image1 
    NewThread.DefaultImage:=image2; //инициализация второго поля image2
NewThread.Resume; // запускаю поток
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Ставь бряк на начало кода потока и трассируй отладчиком до ошибки.
Бряк ставил, ошибку вываливает при выходе из loadImage
fucil вне форума Ответить с цитированием
Старый 06.09.2012, 23:13   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ТС, у вас весь код потока в синхронизации, тогда нет смысла в потоке.
далее, отлаживайте код, смотрите где AV вылетает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.09.2012, 12:17   #9
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию Все равно не решил проблему

В чем же беда эксперты help !
Что то мне подсказывает что тут беда с полями
Я где то тут накуралесил, и по неопытности не знаю где !

Не ну реально а в чем беда, я уже как только не пробовал, все та же ошибка, я в шоке !

Последний раз редактировалось fucil; 07.09.2012 в 12:28.
fucil вне форума Ответить с цитированием
Старый 07.09.2012, 12:32   #10
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию

ахаха решено ! это я тут строку затер и не вчехлил ))))) сутки парил мозг, а проблема была тут:

Код:
pic.LoadFromStream(MS);
Тему закрыто !

Отдельное спасибо Пепел Феникса

Последний раз редактировалось fucil; 07.09.2012 в 12:34.
fucil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли использовать TNotifyEvent через property, в TThread? Человек_Борща Общие вопросы Delphi 4 26.06.2012 19:57
Реализовать Tthread через interface cosmic_call Общие вопросы Delphi 4 20.02.2011 22:36
Загрузка в Image через путь, выбранный в ShellListView artemavd Общие вопросы Delphi 1 20.08.2010 19:12
Частичная загрузка страницы с помощью idHTTP stells27 Работа с сетью в Delphi 2 15.05.2009 08:20
Загрузка .ico на image через Resource delphin100 Мультимедиа в Delphi 6 28.01.2009 18:44