ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[Delphi] Многопоточность.
  #1  
Старый 30.04.2010, 02:16
RedFern.89
Постоянный
Регистрация: 20.01.2010
Сообщений: 338
Провел на форуме:
500264

Репутация: 69
Отправить сообщение для RedFern.89 с помощью ICQ
Question [Delphi] Многопоточность.

Я знаю. Всех эта тема уже ацки задрала. Но прошу вас о помощи. Гугл и тд не предлагать.. просто помогите. Значит суть такова: например у меня в списке 100 проксей, я хочу проверить весь список скажем в 7 потоков. Желательно, что бы все это дело можно было поставить на паузу, возобновить и прервать вовсе. Я немного разобрался с критическими секциями. Но все это сопоставить немогу. Парни! прошу вас о помощи.. Если вам помощь нужна - я помогу и помогал всегда.. Модераторы - простите засранца за темень в знаниях моих...
 
Ответить с цитированием

  #2  
Старый 30.04.2010, 03:40
1n0y
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
Провел на форуме:
1682814

Репутация: 102
Отправить сообщение для 1n0y с помощью ICQ
По умолчанию

пишу код на коленке, думаю разберёшся сам

Код:
p = class(tthread)
 private
 //переменные
 proxy:striing;
 otver:tstringlist;
  procedure getprx;
  procedure checkprx;
 protected
 procedure execute; override;
end;


var
form1..
p1,p2,p3,p4,p5,p6,p7:tthread;
i:integer;
pr:bool;


//процедура чека проксей

procedure p.checkprx;
begin
 otver:=tstringlist.create;
 // тут подставляешь прокси в инди(или что там у тебя). прокси - переменная proxy
 try
  otver.text:=http.get(somesite);
  if length(otver)<>0 then // наверное можно только except юзать
   прокси валидный
  else 
   прокси не валидный
 except 
  прокси не валидный
 end;
end;


//создаёшь процедуру, которая будет выдавать каждому потоку проксю

procedure p.getprx;
begin
 //чтото типо того
 proxy:= form1.memo1.lines[i];
 i:=i+1;
 if i=form1.memo1.lines.count // если прокся последняя - завершать проверку
 then pr:=false;
end;

procedure p.execute;
begin

//тутсоздаёшь все компоненты инди, или что там у тебя

 Synchronize(getprx); //берёш проксю
 repeat 
   checkprx;   //чекаешь
 until pr=false; 
end;


procedure tform1.button1click(sender: tobject);
begin
pr:=true;
i:=0;
 p1 := tnew.create(true);
 p1.freeonterminate := true;
 p1.priority := tpnormal;
 p1.resume;
p2 := tnew.create(true);
 p2.freeonterminate := true;
 p2.priority := tpnormal;
p2.resume;
// и так до p7

end;
 
Ответить с цитированием

  #3  
Старый 30.04.2010, 09:46
агерон
Новичок
Регистрация: 24.10.2009
Сообщений: 1
Провел на форуме:
15317

Репутация: 0
По умолчанию

Цитата:
Сообщение от RedFern.89  
Я знаю. Всех эта тема уже ацки задрала. Но прошу вас о помощи. Гугл и тд не предлагать.. просто помогите. Значит суть такова: например у меня в списке 100 проксей, я хочу проверить весь список скажем в 7 потоков. Желательно, что бы все это дело можно было поставить на паузу, возобновить и прервать вовсе. Я немного разобрался с критическими секциями. Но все это сопоставить немогу. Парни! прошу вас о помощи.. Если вам помощь нужна - я помогу и помогал всегда.. Модераторы - простите засранца за темень в знаниях моих...
книга Джона Рихтера 11 глава функция UserWorkItem, делаешь правельные настройки фукции закидываешь все в пул потоков и наслаждаешься жизнью
 
Ответить с цитированием

  #4  
Старый 30.04.2010, 15:13
Jingo Bo
Познающий
Регистрация: 25.10.2009
Сообщений: 97
Провел на форуме:
604635

Репутация: 15
По умолчанию

Всё очень просто :
Разберем что есть 100 прокси и 7 потоков.
Каждый поток должен что делать :
Брать новый прокси и чекать его, если чекать уже не кого(счётчик равен 100) - поток убиваем. Когда поток убиваем проверяем, последний ли поток убили, если да - то программу информиреум о том что чек закончился.

Теперь разберем куда всунуть критическую секцию. Во-первых первая критическая секция должна стоять там где берется новый прокси, во-вторых вторая должна стоять где идёт проверка послдений ли поток был убит, получаем вот такой общий код процедуры выполнения потока :
Код:
procedure TProxyThread.Execute;
var cur_id : Cardinal;
Begin
      repeat
            cs1.Exiter;
            if (pxIndex >= maxProxy) then
            Begin
                  cs1.Leave;
                  Break;
            end;
            cur_id := pxIndex;
            Inc(pxIndex);
            cs1.Leave;
            //Теперь тут мы чекаем прокси с индексом cur_id
            ...
      until Terminated;
      //Тут убираем наш поток из списка активных потоков, проше всего это
      //можно сделать счётчиком убитых потоков и если этот счётчик становится после
      //инкремента равен 7 - значит все потоки остановлены, я проше так и сделаю
      cs2.Enter;
      Inc(termThreads);
      if (termThreads >= 7) then
      Begin
            //Здесь сигнализируем приложению что чек прокси закончился 
      end;
      cs2.Leave;
end;
Вот и всё, только переменные перед началом запуска потоков должны быть равны :
pxIndex := 0;
ermThreads := 0;

Что бы на время приостановить чек - выполняем из главного потока : cs1.Exiter; (1)
Что бы продолжить чек - выполняем из главного потока : cs1.Leave; (2)
Ток следи что бы (1) и (2) выполнялись симметрично.
 
Ответить с цитированием

  #5  
Старый 01.05.2010, 06:11
M_script_
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме:
1819761

Репутация: 180
Отправить сообщение для M_script_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Jingo Bo  
Во-первых первая критическая секция должна стоять там где берется новый прокси, во-вторых вторая должна стоять где идёт проверка послдений ли поток был убит
Не нужно крит.секций
Interlocked-функции WinAPI
 
Ответить с цитированием

  #6  
Старый 02.05.2010, 20:44
Jingo Bo
Познающий
Регистрация: 25.10.2009
Сообщений: 97
Провел на форуме:
604635

Репутация: 15
По умолчанию

Цитата:
Не нужно крит.секций
Interlocked-функции WinAPI
В чем профит?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность proc_open Whois PHP, PERL, MySQL, JavaScript 2 13.02.2010 12:24
Многопоточность Socket/cURL оно нам надо? Engineer PHP, PERL, MySQL, JavaScript 11 15.11.2009 05:36
Многопоточность с использованием CreateThread [Delphi] GlooK С/С++, C#, Delphi, .NET, Asm 6 25.10.2009 19:26
[Delphi] Добавить многопоточность бруту Navern С/С++, C#, Delphi, .NET, Asm 7 09.02.2007 10:19
Многопоточность в Unix KEZ С/С++, C#, Delphi, .NET, Asm 11 10.08.2005 18:29



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ