Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ потоки

Автор: virt 12.01.2006 5:06

Код
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? А без них можно?

Автор: hardcase 12.01.2006 18:08

Видшь, у тебя есть

Код
while finished < 1 do;

это называется почти бесконечный цикл. - он то как раз и жрёть всё время процессора.

Для синхронизации испоьлзуются сигналы, события, мутексы, семафоры

Думаю тут надо использовать события - event.
Если ты пишешь под Win32, то прочитай про функции CreateEvent, WaitFor, PulseEvent, SetEvent, ResetEvent.

Автор: volvo 12.01.2006 18:20

virt, жестоко... smile.gif

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

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

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

Выше 3% не поднимается...

Автор: hardcase 12.01.2006 19:04

А если грамотно использовать синхронизацию. то вообще использоване будет 0%

Автор: volvo 12.01.2006 19:08

hardcase, я привел пример... Теперь твоя очередь... А то разглагольствовать, как я погляжу, вы все мастера dry.gif

Но не забудь, что автор просил без значительного усложнения программы.

Автор: virt 12.01.2006 19:51

volvo,
методом проб и ошибок пришел к такому же результату::

Код
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.


Только вопрос ,Sleep(100) задает остановку в 100 секунд или миллисекунд?

Загрузка 0%(близка к 0)

Автор: volvo 12.01.2006 19:58

Sleep задает время в ms...

Цитата(rtl.pdf)
29.12.157 Sleep
Synopsis: Suspend execution of a program for a certain time.
Declaration: procedure Sleep(milliseconds: Cardinal)
Visibility: default

Автор: hardcase 12.01.2006 20:13

Вот пример синхронизации с помощью Event, я извиняюсь, ФриПаскаля под рукой нету, но думаю модуль Windows там есть. Тут вроде речь идёт о компилерах 32бит.

Код
program test;
{$threading on}
uses windows, sysutils ,crt;

var Event: cardinal;

function f1(p : pointer) : longint;
var S: string;
begin
   ReadLn(S);
   WriteLn('you entered ',S);
   SetEvent(Event);  //сигналим, можно юзать PulseEvent
   f1 := 0;
end;

begin
   Event:=CreateEvent(nil,true,false,nil);
   ResetEvent(Event);
   BeginThread(@f1);
   WaitForSingleObject(Event,INFINITE); //ждём сигнала
   ReadLn;
end.


Загрузка проца - 0 (ноль)%

Автор: volvo 12.01.2006 20:19

Только без SysUtils, в FPC функция BeginThread описана в System...

Автор: hardcase 12.01.2006 20:45

ок. щас уберу. да, я просто запамятовал - показалось что в Windows есть BeginThread - на самом деле там CreateThread.