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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2017, 10:36   #1
Kaifozhor
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию ошибки при закрытии потоков в Delphi

Прошу сильно не ругать) нужна помощь. написал прогу которая по кнопке пуск запускает 200 потоков и в каждый поток берет из общего stringlist-а свой диапазон строк. Запускаю прогу через некоторое время вылетает с ошибкой "EStringListError with message 'List index out of bounds(0)'." прошу ткните в код. я так думаю завершаю поток не правильно
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, HTTPSend, Ssl_Openssl, SyncObjs, StdCtrls, ComCtrls;

type
  TMainWindow = class(TForm)
    ...
  MyPotok = class(TThread)
    private
      Nomer: Integer;
      Res: String;
      GodBad: Integer;
    public
      procedure Synch;
    protected
      procedure Execute; override;
  end;
  
var
  MainWindow: TMainWindow;
  StL: TStringList;
  GoodFile, BadFile: TextFile;
  CS: TCriticalSection;
  C,J: Integer;
  End_Potok: Boolean;
  Potok: array[1..200] of MyPotok;
implementation

{$R *.dfm}

procedure TMainWindow.FormCreate(Sender: TObject);
begin
CS:=TCriticalSection.Create;
StL:=TStringList.Create;
End_Potok:=False;
end;

procedure TMainWindow.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CS.Free;
StL.Free;
Application.Terminate;
end;

procedure TMainWindow.STARTClick(Sender: TObject);
var
  I,B,M: Integer;
  S: String;
begin

AssignFile(GoodFile, ExtractFilePath(Application.ExeName)+'good.txt');
Reset(GoodFile);
CloseFile(GoodFile);
AssignFile(BadFile, ExtractFilePath(Application.ExeName)+'Bad.txt');
Reset(BadFile);
CloseFile(BadFile);
B:=StrToInt(E_Brute_OK.Text);
C:=100000;
J:=C div 200;

for I:=1 to C do begin
  M:=(100000000-B)-I;
  S:=IntToStr(M);
  StL.Add('9'+S+'5');
end;

for I:=1 to 200 do begin
  Potok[i]:=MyPotok.Create(True);
  Potok[i].Nomer:=I;
  Potok[i].FreeOnTerminate:=True;
  Potok[i].Priority:=TpHighest;
  Potok[i].Resume;
end;

end;

{ MyPotok }

procedure MyPotok.Execute;
var
  HTTP: THTTPSend;
  HTML: TStringList;
  Data: TStringStream;
  I: Integer;
  S,Token,Login: String;
begin
  inherited;
  GodBad:=0;
  
for I:=1 to 500 do begin
    Login:=StL[(Nomer*J)-I];

    //Сдесь GET и POST запрос который нам вернет Response data 

    S:=HTML.Text;
    if Pos('"user":',S)<>0 then begin
    GodBad:=0;
    Delete(S,1,Pos('"user":',S)+8);
    Delete(S,Pos('"',S),Length(S));
    if S<>'' then begin
      Res:=Login+'@mail.ru='+S;
      Synchronize(Synch);
    end;
    end else begin
      GodBad:=1;
      Res:=Login+'@mail.ru';
      Synchronize(Synch);
      GodBad:=0;
    end;
    HTTP.Free;
    HTML.Free;
end;
end;

procedure MyPotok.Synch;
begin
  if GodBad=0 then begin
  MainWindow.M_Log.Lines.Add(TimeToStr(Now)+':'+Res);
  Append(GoodFile);
  WriteLn(GoodFile,Res);
  Closefile(GoodFile);
  end else begin
  Append(BadFile);
  WriteLn(BadFile,Res);
  Closefile(BadFile);
  end;
end;

end.

Последний раз редактировалось Kaifozhor; 30.03.2017 в 10:59.
Kaifozhor вне форума Ответить с цитированием
Старый 30.03.2017, 11:04   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Запускаю прогу через некоторое время вылетает с ошибкой.
Вы уверены что ошибки нет вот здесь?
Цитата:
//Сдесь GET и POST запрос который нам вернет Response data
Если им это удастся. Все таки 200 потоков тянущих данные да с одного ресурса могут банально
-выйти по TimeOut
-по отказу сервера
-забита линия доставки
....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.03.2017, 11:36   #3
Kaifozhor
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

Код:
    HTTP:=THTTPSend.Create;
    HTML:=TStringList.Create;
    HTTP.Cookies.Clear;
    HTTP.UserAgent:='Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36';
    HTTP.HTTPMethod('GET','тут url на сайт');
    if  Pos('csrftoken=', HTTP.Cookies[0])<>0 then
    Token:=StringReplace(HTTP.Cookies[0],'csrftoken=','',[rfReplaceAll]) else
    Token:=StringReplace(HTTP.Cookies[1],'csrftoken=','',[rfReplaceAll]);

    HTTP.Clear;
    Data:=TStringStream.Create('username='+Login);
    HTTP.Document.LoadFromStream(Data);
    Data.Free;
    HTTP.MimeType:='application/x-www-form-urlencoded';

    HTTP.HTTPMethod('POST','тут указал куда отправить post');
    HTML.LoadFromStream(HTTP.Document);

    S:=HTML.Text;
    if Pos('"user":',S)<>0 then begin
    GodBad:=0;
    Delete(S,1,Pos('"user":',S)+8);
    Delete(S,Pos('"',S),Length(S));
    if S<>'' then begin
      Res:=Login+'@mail.ru='+S;
      Synchronize(Synch);
    end;
    end else begin
      GodBad:=1;
      Res:=Login+'@mail.ru';
      Synchronize(Synch);
      GodBad:=0;
    end;
    HTTP.Free;
    HTML.Free;
примерно такой код будет. Подскажи где можно ожидать подводных камней?
Код:
HTML.LoadFromStream(HTTP.Document);
может тут?
Kaifozhor вне форума Ответить с цитированием
Старый 30.03.2017, 11:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
HTTP.Cookies.Clear;
...
    if  Pos('csrftoken=', HTTP.Cookies[0])<>0 then
А где он возьмется ??
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.03.2017, 11:45   #5
Kaifozhor
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

ну index будет равен 0, тоесть StL[0]. индексы в stringlist-ах c 0 начинаются же?
Kaifozhor вне форума Ответить с цитированием
Старый 30.03.2017, 11:48   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
индексы в stringlist-ах c 0 начинаются же?
именно. поэтому в пустом (Clear) списке нет элемента с индексом 0.
Цитата:
с ошибкой "EStringListError with message 'List index out of bounds(0)'.
P.S. см. пост #5 (не #4)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.03.2017, 12:59   #7
Kaifozhor
 
Регистрация: 25.10.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
именно. поэтому в пустом (Clear) списке нет элемента с индексом 0.


P.S. см. пост #5 (не #4)
Большое вам человеческое спасибо!
Kaifozhor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при закрытии IDE (Delphi 2007) kta87 Свободное общение 7 13.09.2013 18:41
Запрос сохранения при закрытии (Delphi 7) munthrekosh Общие вопросы Delphi 8 27.02.2012 21:26
Создание компонента, создающего анимацию вращения формы приложения при открытии и закрытии на Delphi Zireael Помощь студентам 2 23.10.2011 15:38
Счетчик, сохраняющий значение при закрытии программы в Delphi 7 bogdanidze Помощь студентам 1 13.05.2011 00:46
Скрытие панелей инструментов при открытии и отображение при закрытии документа Василий. Microsoft Office Word 0 23.10.2010 00:41