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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2015, 22:59   #1
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию Массив потоков

Делаю так, создаю массив нескольких потоков, так же создаю массив обьектов TIdHttp,
Для каждого потока - свой TIdHttp! (правильно я понял?)

В общем я получаю одни ошибки...
Если делать синхронизацию потоков, все работает, но скорость становится равная как у одного потока.
И в один поток все работает хорошо.
Но я хотел несколько потоков реализовать.
Код напишу ниже.
Код:
   TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  Thread: array[1..10] of TMyThread;
  Http: array[1..10] of TIdHttp;
  s: Integer;

implementation

{$R *.dfm}


{ Thread }

procedure TMyThread.Execute;
var
  j: Integer;
begin
  for j := 1 to 3 do
  begin
    inc(s);
    Form1.Memo1.Text := Http[s].Get('http://www.yandex.ru/');
    Http[s].Free;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
    for i := 1 to 10 do
  begin
    http[i] := TIdHttp.Create(nil);

    Thread[i] := TMyThread.Create(False);
    Thread[i].Priority := tpNormal;
  end;
end;

end.
Задача была сначала сделать такой тест:
Вставить в форму компонентов Memo штук пять и наблюдать воочию загрузку страниц, неважно в каком порядке, важно что бы они все загрузились, но все начало рушиться! Все пошло крахом!
Что задумал изначально- ничего неполучилось! Ни какой многопоточности невышло! Есть какие идеи?
NIKOLAYY2 вне форума Ответить с цитированием
Старый 03.04.2015, 23:17   #2
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Немного код изменил и получил мало того что цифры повторяются но я еще получил число 12117 откуда оно там, как исправить?
Изображения
Тип файла: jpg 4444.jpg (74.4 Кб, 126 просмотров)
NIKOLAYY2 вне форума Ответить с цитированием
Старый 03.04.2015, 23:35   #3
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

У тебя чот ваще всё ужасно((( Для начала выкинь массив идхттп и добаввь:
Код:
TMyThread = class(TThread)
  IdHTTP: TIdHTTP;
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
и соответственно, создай и освободи в execute

Код:
Thread[i] := TMyThread.Create(False);
    Thread[i].Priority := tpNormal;
лучше написать так:
Код:
Thread[i] := TMyThread.Create(True); // создаём поток засуспенженный
    Thread[i].Priority := tpNormal;
 Thread[i].Resume; // запускаем
по умолчанию там итак normal

Последний раз редактировалось Stilet; 04.04.2015 в 09:17.
ДралсяСошибками вне форума Ответить с цитированием
Старый 04.04.2015, 00:40   #4
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

ДралсяСошибками
Спс, да у меня всегда с большими потоками большие проблемы!
Сейчас буду пробовать. А от сюда-

Код:
procedure TMyThread.Execute;
Внутри этой процедуры циклы вобще все убрать?

Я принципа не пойму, например если для скачки страниц в многопоточности:

Для каждого потока - свой TIdHttp! (правильно я понял?)

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

Я самого главного понять немогу...

Последний раз редактировалось Stilet; 04.04.2015 в 09:17.
NIKOLAYY2 вне форума Ответить с цитированием
Старый 04.04.2015, 00:48   #5
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

ну по идее убрать, у тебя будет в каждом потоке по одному идхттп
ДралсяСошибками вне форума Ответить с цитированием
Старый 04.04.2015, 03:11   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Убери Form1 из кода исполнения потока. Именно здесь падение скорости, т.к. всё, что связано с VCL, выполняется в основном (главном) треде приложения. Никогда так не делай.

Дать тебе кусок методичку про потоки почитать?

Да, и не давай нескольким тредам работать с общими глобальными переменными, если без этого можно обойтись! В остальных случаях - только внутри критических секций!!! В той же методичке всё это есть.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось Stilet; 04.04.2015 в 09:17.
min@y™ вне форума Ответить с цитированием
Старый 04.04.2015, 03:18   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Убери Form1 из кода исполнения потока. Именно здесь падение скорости, т.к. всё, что связано с VCL, выполняется в основном (главном) треде приложения. Никогда так не делай.
Точнее убери обращение к Memo1 из потока.

2 min@y™
Цитата:
т.к. всё, что связано с VCL, выполняется в основном (главном) треде приложения.
Оно "выполняется" там, где решил выполнить программист, а вовсе не.
А вот где оно дОлжно выполняться дабы не было геморроя - это как раз нужно знать программисту.

Последний раз редактировалось Stilet; 04.04.2015 в 09:17.
northener вне форума Ответить с цитированием
Старый 04.04.2015, 03:29   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Оно "выполняется" там, где решил выполнить программист
Путаешь с "выполняется", "вызывается".

Synchronize() - наше всё...
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.04.2015, 09:19   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тоже не вижу смысла в потоке автору обращаться к Мемо, что на форме.
Да и Http переменную нужно не массивом хранить, а сделать полем потока. В нем создавать в нем же и грохать.
Например как тут: http://www.programmersforum.ru/showthread.php?t=203699
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2015, 12:32   #10
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Цитата:
min@y™
Дать тебе кусок методичку про потоки почитать?
Давайте почитаем.
NIKOLAYY2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив потоков. Не приходит Terminate grb Общие вопросы Delphi 4 26.01.2015 10:19
Многократное использование потоков(пул потоков) ProgrammistRT Общие вопросы Delphi 10 06.04.2014 13:42
Массив потоков, и как они очищаются Winexcel Общие вопросы Delphi 5 09.10.2013 16:43
Синхронизация потоков Fireblade-fan Общие вопросы Delphi 5 17.12.2012 01:57
Не дать накапливаться N кол-ву потоков в критической секции. Массив. HSR Общие вопросы Delphi 7 15.11.2012 01:02