потоки

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

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

Сообщение virt » 12.01.2006 02:17:11

Код: Выделить всё
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? Можно ли без них?
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение STAKANOV » 12.01.2006 02:52:58

может дело в 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.
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение PVOzerski » 12.01.2006 12:00:02

Дай ты системе продохнуть! :) В виндах я бы засунул sleep в цикл while not keypressed. Для *никсных платформ тоже что-нибудь такое должно быть.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Иван Шихалев » 12.01.2006 12:39:13

Да и цикл
Код: Выделить всё
while finished < 1 do;
жрет все процессорное время, до которого дотягивается...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение virt » 12.01.2006 14:56:48

Код: Выделить всё
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)
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение STAKANOV » 12.01.2006 17:13:10

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>
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Janus » 12.01.2006 18:56:54

Лучше не ставить sleep(int), при int меньше 60, т.к. винда это не переваривает и все равно поставит сколько ей вздумается, т.е. около 60 - 70.
Janus
постоялец
 
Сообщения: 134
Зарегистрирован: 07.11.2005 17:06:49

Сообщение virt » 12.01.2006 20:24:14

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

Suspend execution of a program for a certain time.


Может прочто неточность в описании ,и вместо program они имели ввиду thread?
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение serg_iv » 12.01.2006 20:37:56

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

Сообщение STAKANOV » 12.01.2006 21:57:32

У меня sleep всегда приостанавливал текущий нить. 100% :)
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru