Главная страница
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.033 c
14-1078469470
Sergey_Masloff
2004-03-05 09:51
2004.04.04
Хорошая книга по полевой хирургии для начинающего


9-1064494630
Ilyasim
2003-09-25 16:57
2004.04.04
DXF в массиве


11-1058013131
Siliks
2003-07-12 16:32
2004.04.04
или &#xA0;глупый или.... (ошибка в KOL RichEdit)


14-1078856818
Undert
2004-03-09 21:26
2004.04.04
Может кто на пальцах объяснит механизм действия


1-1078935358
Александр1
2004-03-10 19:15
2004.04.04
Работа с Word