потоки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
virt
новенький
Сообщения: 35
Зарегистрирован: 01.12.2005 11:31:41

Сообщение virt »

Код: Выделить всё

program test;
{$threading on}
uses sysutils ,crt;
var finished : longint;

function f1(p : pointer) : longint;
begin
   while not keypressed do;
   InterLockedIncrement(finished);
   f1 := 0;
end;

begin
   finished := 0;
   BeginThread(@f1);
   while finished < 1 do;
end.


Самая простая программа использующая потоки. При запуске загруженность процессора 96-98%. Как сделать чтобы не было такой загрузки проца? Использовать Suspend и Resume? Можно ли без них?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

может дело в crt ?
попробуй

Код: Выделить всё

program test;
{$threading on}
uses sysutils;
var finished : longint;

function f1(p : pointer) : longint;
begin
  readln;
  InterLockedIncrement(finished);
  f1 := 0;
end;

begin
  finished := 0;
  BeginThread(@f1);
  while finished < 1 do;
end.
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

Дай ты системе продохнуть! :) В виндах я бы засунул sleep в цикл while not keypressed. Для *никсных платформ тоже что-нибудь такое должно быть.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Да и цикл

Код: Выделить всё

while finished < 1 do;
жрет все процессорное время, до которого дотягивается...
virt
новенький
Сообщения: 35
Зарегистрирован: 01.12.2005 11:31:41

Сообщение virt »

Код: Выделить всё

program test;
{$threading on}
uses sysutils;
var finished : longint;

function f1(p : pointer) : longint;
begin
 readln;
 InterLockedIncrement(finished);
 f1 := 0;
end;

begin
 finished := 0;
 BeginThread(@f1);
 while finished < 1 do;
end.

Загрузка - 96-98%

Код: Выделить всё

program test;
{$threading on}
uses sysutils ,crt;
var finished : longint;

function f1(p : pointer) : longint;
begin
 while not keypressed do Sleep(10);
 InterLockedIncrement(finished);
 f1 := 0;
end;

begin
 finished := 0;
 BeginThread(@f1);
 {Sleep(10);}
 while finished < 1 do;
end.

Sleep(10) по документации в винде должна остановить всю программу(не поток) на 10 секунд ,однако 0 эффекта при любом вызове(в комментарии).
Остановка потока (fpSleep ,fpNanoSleep) работают под линь(uses BaseUnix ,OldLinux) ,работают они реально или нет не проверял (компилера под линь нет ,позже проверю). Эквивалентов этих функций под винду не нашел.

Код: Выделить всё

program test;
{$threading on}
uses sysutils ,crt;
var finished : longint;

function f1(p : pointer) : longint;
begin
 while not keypressed do;
 InterLockedIncrement(finished);
 f1 := 0;
end;

begin
 finished := 0;
{ BeginThread(@f1);}
 while finished < 1 do;
end.

Загрузка - 96-98%

Код: Выделить всё

program test;
{$threading on}
uses sysutils ,crt;
var finished : longint;

function f1(p : pointer) : longint;
begin
 while not keypressed do;
 InterLockedIncrement(finished);
 f1 := 0;
end;

begin
 finished := 0;
 BeginThread(@f1);
 while finished < 1 do Sleep(1);
end.

Загрузка - 33-52%

Код: Выделить всё

program test;
{$threading on}
uses sysutils ,crt;
var finished : longint;

function f1(p : pointer) : longint;
begin
 while not keypressed do Sleep(1);
 InterLockedIncrement(finished);
 f1 := 0;
end;

begin
 finished := 0;
 BeginThread(@f1);
 while finished < 1 do Sleep(1);
end.

Загрузка - 0%(почти 0)
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Sleep(10) по документации в винде должна остановить всю программу(не поток) на 10 секунд ,однако 0 эффекта при любом вызове(в комментарии).

Аргумент в миллисекундах, 10 секунд это sleep(10000). И по-моему опыту она всетаки именно нить приостанавливает.

<a href='http://www.freepascal.org/docs-html/rtl/sysutils/sleep.html' target='_blank'>http://www.freepascal.org/docs-html/rtl/sysutils/sleep.html</a>
Janus
постоялец
Сообщения: 134
Зарегистрирован: 07.11.2005 16:06:49

Сообщение Janus »

Лучше не ставить sleep(int), при int меньше 60, т.к. винда это не переваривает и все равно поставит сколько ей вздумается, т.е. около 60 - 70.
virt
новенький
Сообщения: 35
Зарегистрирован: 01.12.2005 11:31:41

Сообщение virt »

STAKANOV
В последнем примере она нить и останавливает, хотя
Sleep

Suspend execution of a program for a certain time.


Может прочто неточность в описании ,и вместо program они имели ввиду thread?
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

А может быть имелась в виду именно программа? Без thread?
Ведь в данном случае thread играет роль программы, только запущенной параллельно основному потоку.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

У меня sleep всегда приостанавливал текущий нить. 100% :)
Ответить