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

Вниз

Помогите почему не работают паралельно нити ??   Найти похожие ветки 

 
KyRo ©   (2004-03-12 21:44) [0]

Помогите найти ответ почему не работают
нити.
Вот текст
Type
TPortScaner=class(TThread)
   Soket:array[1..250] of TSocket;{Каждому процесу свой сокет}
 private
   procedure RunScan; {Дополнительная процедура вызываемая из события}
 protected
   procedure Execute; override; {Процедура событие на создание процесса}
end;

Имею масив нитей
Sok: array [1..250] of TPortScaner; {Масмв нитей}

которые запускаю по одной

For i:=1 to 250 do
  begin
     Sok[i]:=TPortScaner.Create(True);
     //Освободить память при прерывании процесса
     Sok[i].FreeOnTerminate:=true;
     //установить приоритет
     Sok[i].Priority:=tpLowest;
     //запустить процесс
     Sok[i].Resume;
  end;
запустив процес
у меня обработчик переходит в
Procedure TPortScaner.Execute;
begin
//Перенаправляем в дополнительную процедуру
Synchronize(RunScan);
end;

от куда перенаправившись
переходит в процедуру TPortScaner.RunScan;
где в зависимости от номера процесса проводятся
расчеты и запись в разные файлы.

Так вот у меня сначала заканчивает работу первая нить ,а потом только
начинает работать следуюющая. Как мне сделать что бы они работали
паралельно. И как можно уменьшить нагрузку на процессор, а то программа не работоспособна пока не выполнятся процессы.


 
Defunct ©   (2004-03-12 22:45) [1]

Убрать Synchronize


 
KyRo ©   (2004-03-13 00:28) [2]

И делать все то что делаю в дополнитеоьной процедуре в
процедуре TPortScaner.Execute  ??


 
Defunct ©   (2004-03-13 00:45) [3]

Это уже ваше дело в какой процедуре делать, можно просто оставить как есть:

Procedure TPortScaner.Execute;
begin
  RunScan;
end;


А вот в RunScan использовать Sinchronize только там, где имеет место обращение к визуальным компонентам. Иначе получается у вас все действия выполняются в одном потоке. Почитайте Help про Synchronize


 
KyRo ©   (2004-03-13 01:20) [4]

Спасибо загляну.


 
TUser ©   (2004-03-13 08:16) [5]

Synchronize заставляет процедуру выполниться в контексте основного потока. Поэтому, когда ты выбираешь Execute, у тебя выполняется Synch, и основной поток занят выполнением работы, которая там прописывается. И только потом он создает второй поток.
Надо разделить проц. RunScan на несколько маленьких. Не знаю, что она у тебя делает, поэтомй поясню на другом примере, допустим тебе надо на прогрессбар выводить значение некой переменной, читаемой из основного потока. Тогда нельзя написать вызов через Synch такого кода
while not MyVar=100 do
  if ProgressBar1.Position<>MyVar then
     if MyVar mod 10 = 0 then begin
        ProgressBar.Position:=MyVar;  
        sleep(1);
        end;
А надо в отдельные проц-ры вытащить чтение значения Position, присвоение значения Position и чтение MyVar. В Execute эти методы вызывать синхронайзом, сравнивать и если требуется, вызывать метод, который устанавливает правильное значение. Тогда, помимо Synch будет в потоке и другой код, т.е. не весь код, который ты напишешь, будет выполняться в контексте основного потока.



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

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

Наверх




Память: 0.48 MB
Время: 0.028 c
7-1075127727
zamkom
2004-01-26 17:35
2004.04.04
Работа с СОМ портом


14-1078905227
SPeller
2004-03-10 10:53
2004.04.04
Теперь и я...


1-1079390312
Michail Dalakov
2004-03-16 01:38
2004.04.04
MSScriptControl


1-1079600030
Timego
2004-03-18 11:53
2004.04.04
Межпроцессное взаимодействие средствами COM+


6-1075285650
Васек
2004-01-28 13:27
2004.04.04
Ping