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

Вниз

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

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

Наверх





Память: 0.46 MB
Время: 0.036 c
1-1079130133
graf
2004-03-13 01:22
2004.04.04
RxRichEdit


9-1063296486
Unknown user
2003-09-11 20:08
2004.04.04
Оцените мою демку


3-1078414136
Ceval
2004-03-04 18:28
2004.04.04
Есть таблица у нее поля упорядочить по ним значения


4-1075176461
Drunya
2004-01-27 07:07
2004.04.04
Как поймать заголовки окон


4-1074476763
Неопытный
2004-01-19 04:46
2004.04.04
Использование хука из сервиса





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