Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
2-1136394775
ArtemESC
2006-01-04 20:12
2006.01.22
Форма потеряла фокус...


14-1135585883
ilya39
2005-12-26 11:31
2006.01.22
версия ADO


14-1135416752
Витёк
2005-12-24 12:32
2006.01.22
Как узнать число простое или нет?


5-1122625321
Juice
2005-07-29 12:22
2006.01.22
Как отлаживать свои компоненты?


3-1132758007
Vikusik
2005-11-23 18:00
2006.01.22
inser+insert + ..... +insert = 0 md free memory





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский