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

> потоки, Thread ,freepascal
virt
сообщение 12.01.2006 1:06
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
hardcase
сообщение 12.01.2006 14:08
Сообщение #2


code warrior
****

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

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


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

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

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

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

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


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.01.2006 14:20
Сообщение #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% не поднимается...
 К началу страницы 
+ Ответить 
hardcase
сообщение 12.01.2006 15:04
Сообщение #4


code warrior
****

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

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


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


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


Гость






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

Но не забудь, что автор просил без значительного усложнения программы.
 К началу страницы 
+ Ответить 
virt
сообщение 12.01.2006 15:51
Сообщение #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 - 12.01.2006 15:52


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.01.2006 15:58
Сообщение #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
 К началу страницы 
+ Ответить 
hardcase
сообщение 12.01.2006 16:13
Сообщение #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 - 12.01.2006 16:46


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


Гость






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


code warrior
****

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

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


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


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

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

 



- Текстовая версия 20.07.2025 19:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"