IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> потоки, Thread ,freepascal
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Видшь, у тебя есть
Код
while finished < 1 do;

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

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

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

Сообщение отредактировано: hardcase -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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% не поднимается...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

Но не забудь, что автор просил без значительного усложнения программы.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

Репутация: -  6  +


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)

Сообщение отредактировано: virt -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Вот пример синхронизации с помощью 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 (ноль)%

Сообщение отредактировано: hardcase -


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Только без SysUtils, в FPC функция BeginThread описана в System...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.05.2024 17:58
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name