Форум «Всё о Паскале» _ 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, жестоко...
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, я привел пример... Теперь твоя очередь... А то разглагольствовать, как я погляжу, вы все мастера
Но не забудь, что автор просил без значительного усложнения программы.
Автор: 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.