Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки и методы работы с ними. [D7, WinXP]


noname:)) ©   (2006-01-05 17:43:00) 

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


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

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

         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;


umbra   (2006-01-06 12:45:00) [2]

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

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


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

TUser ©   (05.01.06 19:20) [3]


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


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

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


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

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


Eraser   (2006-01-05 22:10:00) [5]


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

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


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

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


TUser   (2006-01-05 19:55:00) [7]


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

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


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

Это как?

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:20:00) [9]

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

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


isasa   (2006-01-05 18:44:00) [10]

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

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

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

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


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо