Показать сообщение отдельно

  #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) выполнялись симметрично.
 
Ответить с цитированием