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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2017, 19:31   #1
DKENT
Форумчанин
 
Регистрация: 09.09.2010
Сообщений: 114
Радость Потоки GET запроса

Доброго времени суток!
Читал много информации но никак не могу понять как сделать несколько потоков в программе!

Вот пример кода:
Код:
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
     Edit1: TEdit;
 IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TMyThread = class(TThread)

    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
   MyThread: TMyThread;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpNormal;
end;

procedure TMyThread.Execute;
var
i:integer;
begin
i:=1;
form1.IdHTTP1.IOHandler:=form1.IdSSLIOHandlerSocketOpenSSL1;
for i:=1 to 100000 do
begin
form1.idhttp1.Get('http://google.com);
end;
end;
Программа работает в один поток, а вот как сделать чтобы работала к примеру в 10 потоков!

Прошу не отправлять в гугл, информации море прочитал, но никак не могу понять как связать потоки и сделать больше одного! На примере пойму обязательно!
DKENT вне форума Ответить с цитированием
Старый 27.03.2017, 22:52   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Объекты должны быть объявлены где-нибудь внутри потока, с компонентами на форме работать не нужно - теряется многопоточность, да ещё и конфликты доступа. Примерно так
Код:
procedure TMyThread.Execute;
var
i:integer;
 IdHTTP1: TIdHTTP; //объявляем локально для экземпляра потока
 IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
i:=1;
IdHTTP1:= TIdHTTP.Create();//создаём внутри потока
IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create;
IdHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
for i:=1 to 100000 do
begin
try
idhttp1.Get('http://google.com');
sleep(1000);//прост )
except
end;
end;
IdSSLIOHandlerSocketOpenSSL1.free;
IdHTTP1.free;
end;
При каждом клике на кнопку запускается поток. Но в таком примере теряется информация, необходимая для внешнего управления, т.к. переменная MyThread: TMyThread; только одна. Для 10 потоков можно завести либо массив, либо список, либо пул. В крайнем случае 10 отдельных переменных ))
Цитата:
Прошу не отправлять в гугл
Яндекс в помощь

P.S. IdHTTP1 и IdSSLIOHandlerSocketOpenSSL1 с формы можно выкинуть
eoln вне форума Ответить с цитированием
Старый 28.03.2017, 00:06   #3
DKENT
Форумчанин
 
Регистрация: 09.09.2010
Сообщений: 114
По умолчанию

Спасибо за подсказку, но остаться не решенным один вопрос как из 1 потока сделать к примеру 10?
DKENT вне форума Ответить с цитированием
Старый 28.03.2017, 00:12   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Создать десять обехктов класса TMyThread не вариант?
p51x вне форума Ответить с цитированием
Старый 28.03.2017, 00:20   #5
DKENT
Форумчанин
 
Регистрация: 09.09.2010
Сообщений: 114
По умолчанию

Да пробую но почему то не получается их в проект добавить ошибки лезут!
DKENT вне форума Ответить с цитированием
Старый 28.03.2017, 01:38   #6
DKENT
Форумчанин
 
Регистрация: 09.09.2010
Сообщений: 114
По умолчанию

Попробовал сделать 2 потока но при запуске программа виснет намертво!

Код:

var
  Form1: TForm1;
   DoWork1: TMyThread;
implementation

{$R *.dfm}


TMyThread = class(TThread)

    private
    { Private declarations }
  protected
     procedure DoWork1;
     procedure DoWork2;
    procedure Execute; override;
  end;

procedure TMyThread.DoWork1;
var
i:integer;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
IdHTTP1:= TIdHTTP.Create();
IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create;
IdHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.HandleRedirects:=true;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
for i:=100000 to 200000 do
begin
try
idhttp1.Get('http://mysite.ru/index.php?id='+inttostr(i));
sleep(1000);
except
end;
end;
IdSSLIOHandlerSocketOpenSSL1.free;
IdHTTP1.free;
end;

procedure TMyThread.DoWork2;
var
i:integer;
IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
IdHTTP1:= TIdHTTP.Create();
IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create;
IdHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.HandleRedirects:=true;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
for i:=200000 to 300000 do
begin
try
idhttp1.Get('http://mysite.ru/index.php?id='+inttostr(i));
sleep(1000);
except
end;
end;
IdSSLIOHandlerSocketOpenSSL1.free;
IdHTTP1.free;
end;

procedure TMyThread.Execute;
begin
Synchronize(DoWork1);
Synchronize(DoWork2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DoWork1:=TMyThread.Create(False);
DoWork1.Priority:=tpNormal;
button1.Enabled:=false;
end;
Подскажите в чем проблема?
DKENT вне форума Ответить с цитированием
Старый 28.03.2017, 06:36   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

procedure TMyThread.DoWork2; вообще не нужна.
Создаём 10 переменных под потоки
Код:
var
  Form1: TForm1;
   DoWork1: array[1..10] of TMyThread;
Запускаем
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
for i :=1 to 10 do begin
DoWork1[i]:=TMyThread.Create(False);
DoWork1[i].Priority:=tpNormal;
end;
button1.Enabled:=false;
end;
Синхронизацию убрать, она нужна для работы с общими данными/компонентами и т.п. Всё что внутри Synchronize выполняется не в данном потоке, а в главном, т.е, в самой главной программе. Оттого и виснет, что нет многопоточности
Код:
procedure TMyThread.Execute;
begin
DoWork1;
end;
eoln вне форума Ответить с цитированием
Старый 28.03.2017, 11:32   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

различие между doWork1 doWork2 это разные параметры цикла
Код:
for i:=100000 to 200000 do
1. делаем это параметрами новой процедуры
Код:
procedure doWorkX(startpos, finishpos: integer);
begin
...
for i:=startpos to finishpos do
Код:
proccedure TMyThread.Execute;
begin
  DoWorkX(???, ???); //что же здесь
2. Добавляем в описание потока поля
Код:
TMyThread = class(TThread)

    private
    { Private declarations }
   FmyStartPos, FmyFinishpos: integer;
Код:
proccedure TMyThread.Execute;
begin
  DoWorkX(FmyStartPos, FmyFinishPos); //теперь знаем что здесь
НО как же нам дать разные значения

3. пишем СВОЕ создание объектов
Код:
TMyThread = class(TThread)

    private
    { Private declarations }
   FmyStartPos, FmyFinishpos: integer; 
public
   constructor Create(Asuspended: boolean; AstartPos, AFinishPos: integer);

constructor TMyThread.Create((Asuspended: boolean; AstartPos, FFinishPos: integer);
begin
  inherited Create(Asuspended); //применить ранее имевiееся создание
  // а теперь ЗАПОЛНИМ наши новые поля ИСПОЛЬЗУЯ наши новые параметры
  FmyStartpos:=AStartpos;
  FmyFinishPos:=AfinishPos;
end;
и делаем два потока с разными диапазонами
Код:
t1:=TMyThread.Create(true, 00001, 10000);
t2:=TMyThread.Create(true, 10001, 20000);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.03.2017 в 11:35.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Потоки в с++ tutty-frutty Общие вопросы C/C++ 3 09.02.2013 15:20
Потоки ISV-777 Общие вопросы по Java, Java SE, Kotlin 0 30.05.2012 12:26
Потоки в с# qwerty74 C# (си шарп) 5 22.06.2011 13:57
потоки tanek Помощь студентам 6 15.03.2010 21:42