Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

Потоки и методы работы с ними.   Найти похожие ветки 

 
noname:))   (2006-01-05 17:43) [0]

Здравствуйте.
Есть следующий алгоритм.
В цикле запускается некоторое количество потоков в которых выполняются следующие действия
 1. выполнятся пинг.
 2. если пинг удачен то выполняется поиск общих ресурсов.
Всё бы ничего но при большом диапазоне адресов одновременно запускается большое количество потоков и в большинстве случаев это заканчивается ошибкой Thread Creation Error: Недостаточно памяти для обработки команды. Чую нужно както ограничить количество параллельно работающих потоков. Но как? С потоками я пока на ВЫ, поэтому надеюсь на Вашу помощь и опыт. Также интересует вопрос, как принудительно завершить работающие в данный момент потоки.
Если кто откликнется могу выслать или кинуть в форум кусок кода в котором создаются потоки.


 
Игорь Шевченко ©   (2006-01-05 18:10) [1]


>  1. выполнятся пинг.
>  2. если пинг удачен то выполняется поиск общих ресурсов.
>


Направленность какая-то сомнительная. Обычно от подобных программ Firewall рекомендуют. Я бы не стал давать советы.


 
isasa ©   (2006-01-05 18:44) [2]

:)
Зачем так строго.

приблизительно, так...
где-то, в управляющем потоке.

var aThread: array of hThread;
    Thstatus: integer;
...
SetLength(aThread, maxActiveThreads);   // maxActiveThreads=10,20, по возможностям

во время перебора списка проверяем свободный поток
....
GetExitCodeThread(aThread[i], Thstatus);
if Thstatus<>STILL_ACTIVE then
 новый поток
else <ждем, в рамках списка>


 
TUser ©   (2006-01-05 19:20) [3]

Удалено модератором. :)

Если это твои компьютеры (в твоей локалке) - то проблемм нет. Сканируй не все адреса, а только правильные, ты же их знаешь. А если не знаешь - то лезешь, куда не просят, и см. [1].


 
noname:))   (2006-01-05 19:44) [4]

Это как?

var aThread: array of hThread;
   Thstatus: integer; i: integer;
begin
SetLength(aThread, 20);
for i:=0 to 200 do
 begin
   GetExitCodeThread(aThread[i], Thstatus);
  if Thstatus<>STILL_ACTIVE then
    hThread := TThread.Create("192.168.0." + inttostr(i));
  else
  //как это в рамках списка?
 end;
end;

Тпа того? Чтото я не совсем понял...
Чую бред полный написал:)))))))))))))))))))))))))
Долго думал слать или не слать... Послал... Мож кто посмеётся:) Или поплачет:))


 
TUser ©   (2006-01-05 19:55) [5]


> isasa ©   (05.01.06 18:44) [2]

Я бы что-то типа семафора смастерил.


 
noname:))   (2006-01-05 19:56) [6]

Пробовал. почемуто не помогло... Всё начинает работать медленнее и ошибка перестаёт появлятся....


 
Eraser ©   (2006-01-05 22:10) [7]


> noname:))   (05.01.06 19:56) [6]

Значит плохо пробовал, насчёт семафора TUser правильно советует. Ставить его надо в цикле управляющего потока.


 
GanibalLector ©   (2006-01-06 00:46) [8]

Ограничивай кол-во потоков! Кстати, в дайджестах можно найти пул потоков от А.Panov"a.


 
Игорь Шевченко ©   (2006-01-06 11:50) [9]

TUser ©   (05.01.06 19:20) [3]


> Если это твои компьютеры (в твоей локалке) - то проблемм
> нет


Все равно есть проблемы. Зачем программно определять общие ресурсы ? В локалке можно и Explorer"ом посмотреть.

У меня outpost показывал довольно большое количество попыток за сеанс посмотреть мои общие ресурсы. Что в них такого интересного ?


 
umbra ©   (2006-01-06 12:45) [10]

2 Игорь Шевченко ©   (06.01.06 11:50) [9]

а чего ж они общие, если там смотреть нечего? [неуверенная улыбка]


 
noname:))   (2006-01-08 15:34) [11]

Ошибочка в пуле Панова... Точнее скорее всего это несовместимость версий делфи...

         while (FJobs.Count<>0) and (NumThr<>-1) do
         begin
           if NumThr=-1 then Continue;   //Нет свободных потоков
           Thr := FPool.Items[NumThr];
           Thr.isFree := False;          //Флаг "Поток занят"

           Job := FJobs.Pop;             // ВОТ ТУТ Incompatible types: "PJob" and "string"

           Thr.SetJob(Job^.Proc,Job.Parm); //Устанавливаем параметры для выполнения
           Dispose(Job);                   //Освободить память
           Thr.FEventExec.SetEvent;        //Известить поток о готовности к выполнению
           NumThr := GetFreeThr;           //Получить номер свободного потока
         end;

 PJob=^TJob;
 TJob=record
   Proc: TProcThr;         //клиентская процедура
   Parm: Pointer;          //параметры процедуры
 end;



Страницы: 1 вся ветка

Текущий архив: 2006.01.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.071 c
14-1132836420
linox
2005-11-24 15:47
2006.01.22
Нужно сделать прогу для админа в инет-кафе (просьба)


14-1135749047
begin...end
2005-12-28 08:50
2006.01.22
С Днём рождения! 28 декабря


14-1135835187
begin...end
2005-12-29 08:46
2006.01.22
С Днём рождения! 29 декабря


14-1135656549
Rentgen
2005-12-27 07:09
2006.01.22
Товар за 20-30% от его реальной стоимости


14-1135390869
SergP
2005-12-24 05:21
2006.01.22
посоветуйте компонент для построения графиков