Форум: "Основная";
Текущий архив: 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