Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Idhttp и поток 
:(
    Опции темы
drdead84
  Дата 6.12.2014, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.11.2014

Репутация: нет
Всего: нет



Доброе утро
нужна помощь
есть программа - кратко - сдирает 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;


Это сообщение отредактировал(а) drdead84 - 6.12.2014, 07:49
PM MAIL   Вверх
Illusion Dolphin
Дата 6.12.2014, 09:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Код

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


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
drdead84
Дата 6.12.2014, 13:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.11.2014

Репутация: нет
Всего: нет



спасибо за ответ 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;

PM MAIL   Вверх
Illusion Dolphin
Дата 6.12.2014, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

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

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

Это сообщение отредактировал(а) Illusion Dolphin - 6.12.2014, 14:57


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
drdead84
Дата 7.12.2014, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.11.2014

Репутация: нет
Всего: нет



Illusion Dolphin
спасибо
поместил в protected каждого потока процедуры
сменил ресурс, откуда тянутся данные
переработал все полностью - все процедуры
ускорение - примерно процентов 40% от предыдущего кода
спасибо за пинок и пинок в сторону настойчивости
 smile 
вдумчивый просмотр указанной темы помог!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.