Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Idhttp и поток


Автор: drdead84 6.12.2014, 07:42
Доброе утро
нужна помощь
есть программа - кратко - сдирает 6 страниц с сайта(записаны адреса в form1.memo3.Lines.Strings), парсит данные с помощью регулярных выражений и записывает в стринглист
процедура нагружает проц, поэтому хотелось бы в потоке сделать
вышло вот что - при первом запуске все ок. все данные нормально получаются. 
второй и следующие запуски - выдает ошибку что неизвестный протокол, то есть - не может получить доступ к адресам из memo3.
в то же время при тестировании без потока - данные каждый раз нормально снимаются. 
есть подозрение что поток тупит и во второй раз не получает урл из мемо.

кто может пинком указать правильное направление? smile 
в потоках не очень силен - поэтому создаю тему здесь.
delphi xe2

Код

/// сам поток
procedure TMyThread.Execute;
begin
form1.getquotes;
  end;

/// запуск потока
procedure TForm1.Button1Click(Sender: TObject);
begin
try
 MyThread:=TMyThread.Create(False);
//Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume
//Далее можно указать параметры потока, например приоритет:
  MyThread.Priority:=tpNormal;
  mythread.FreeOnTerminate:=false;

///процедура которая в потоке выполняется
procedure TForm1.getquotes;
for I := 0 to 5 do
 begin
 memo2.Clear;
   RegExp:=TRegExpr.Create;
 http:= TIDhttp.Create();
ce:=i+1;

rplc :='';
real:='';
form1.memo2.Lines.Add(http.Get(form1.memo3.Lines.Strings[i]));
http.Disconnect;
 http.free;
////здесь парсинг данных, вывод в стринглист/////
   RegExp.Free;
         MyThread.terminate;
 end;

Автор: Illusion Dolphin 6.12.2014, 09:42
Код

procedure TMyThread.Execute;
begin
form1.getquotes;
  end;
...
memo2.Clear;
...
form1.memo2.Lines.Add(http.Get(form1.memo3.Lines.Strings[i]));

Нельзя из потока вызывать визуальные компоненты без использования Synchronize

Цитата

mythread.FreeOnTerminate:=false;

А вы его нигде не уничтожили - утечка

Цитата

http:= TIDhttp.Create();

http должен быть объявлен в потоке (этого у вас не видно), туда же RegExp

Добавлено через 48 секунд
И вам сюда http://forum.vingrad.ru/forum/topic-60076.html

Автор: drdead84 6.12.2014, 13:45
спасибо за ответ Illusion Dolphin

вопрос вот в чем - в предыдущей версии моей проги - могу скинуть - там куча целая процедур выполняется в потоке(код внизу привел)
при этом там каждая процедура обращалась вольно к любому визуальному компоненту. и запуск ее - вообще чудо. я ее нигде не уничтожаю тоже.
а здесь - как прокляли это мемо3. сперва норм обращается - потом клинит поток - и он в упор не видит его
то ли инди как всегда кривая. то ли руки кривоватые до потоков.
ту статью о потоках читал
когда только в них начал разбиратся.
 
пример
Код

procedure TMyThread.Execute;
begin
 form1.Get(nil);
  end;

// и сама процедура Get
form1.Panel15.Visible:=true;
 image38.Visible:=false;
 statictext1.Visible:=true;
  statictext1.Caption:=('Обновление');
   GIFImageDefaultAnimate := True;
form1.Color:=clred;
form1.TransparentColor:=true;
form1.TransparentColorValue:=clred;
form1.Brush.Color:=clred;
get:=idhttp1.Get('http://api.worldoftanks.ru/wot/account/info/?application_id=demo&fields=global_rating,nickname,updated_at,last_battle_time,statistics.all&account_id=2158161');
  JsObject1 := SO(get);
   JsObject2 := JsObject1.O['data'];
  JsObject1 := JsObject2.O['2158161'];
label15.Caption:= inttostr(JsObject1.i['global_rating']);
DT:= UnixToDateTime(JsObject1.i['updated_at']);
dt:=IncHour(dt, 2);
label6.Caption:= datetimeToStr(dt);
JsObject2 := JsObject1.O['statistics'];
JsObject1 := JsObject2.O['all'];
 i1:= JsObject1.i['battles'];
i2:= JsObject1.i['wins'];
winr:= roundto(i2/i1*100,-5);
  label11.Caption:=' Боев: '+   inttostr(JsObject1.i['battles']);
label10.Caption:= 'Урон:    '+floattostr(roundto((JsObject1.i['damage_dealt'])/(JsObject1.i['battles']),-5));
  label9.Caption:= 'Опыт:    '+floattostr(roundto((JsObject1.i['xp'])/(JsObject1.i['battles']),-5));
min:= IncMinute(Now,15);
 mmm:=min;
//min:=IncMinute(15));
label7.Caption:= timetostr(min);
  statictext1.Caption:=('% побед обновлен');
// и еще обращалась  конце к куче процедур без проблем        
  mail;
          ffs;
            winrate;
            currex;
            reloadcomplete;
            form1.Panel15.Visible:=false;
            image38.Visible:=true;
            statimg;

// запуск самого потока

 MyThread:=TMyThread.Create(False);
  MyThread.Priority:=tpNormal;

Автор: Illusion Dolphin 6.12.2014, 14:57
Цитата

ту статью о потоках читал

Читайте ещё раз, т.к. первый раз вы ничего из неё не поняли. При многопоточности некоторые вещи могут иногда работать, а иногда падать и зависать. Ещё почитайте про оформление кода - лишним не будет.

Автор: drdead84 7.12.2014, 06:24
Illusion Dolphin
спасибо
поместил в protected каждого потока процедуры
сменил ресурс, откуда тянутся данные
переработал все полностью - все процедуры
ускорение - примерно процентов 40% от предыдущего кода
спасибо за пинок и пинок в сторону настойчивости
 smile 
вдумчивый просмотр указанной темы помог!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)