Помощь - Поиск - Пользователи - Календарь
Полная версия: потоки
Форум «Всё о Паскале» > Pascal, Object Pascal > 32 битные компиляторы
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? А без них можно?
hardcase
Видшь, у тебя есть
Код
while finished < 1 do;

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

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

Думаю тут надо использовать события - event.
Если ты пишешь под Win32, то прочитай про функции CreateEvent, WaitFor, PulseEvent, SetEvent, ResetEvent.
volvo
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
А если грамотно использовать синхронизацию. то вообще использоване будет 0%
volvo
hardcase, я привел пример... Теперь твоя очередь... А то разглагольствовать, как я погляжу, вы все мастера dry.gif

Но не забудь, что автор просил без значительного усложнения программы.
virt
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
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
Вот пример синхронизации с помощью 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
Только без SysUtils, в FPC функция BeginThread описана в System...
hardcase
ок. щас уберу. да, я просто запамятовал - показалось что в Windows есть BeginThread - на самом деле там CreateThread.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.