Главная страница
    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.47 MB
Время: 0.029 c
2-1136440995
ezorcist
2006-01-05 09:03
2006.01.22
Эмулировать клик мыши?


14-1135341979
IAmDanil
2005-12-23 15:46
2006.01.22
Input-Output


6-1129122090
Piero
2005-10-12 17:01
2006.01.22
ClientSocket


2-1136440033
ezorcist
2006-01-05 08:47
2006.01.22
Изменить палитру на Image


2-1135677661
Ice
2005-12-27 13:01
2006.01.22
Как "отцепить" мышь от контрола ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский