Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2011, 23:35   #1
MetR
Пользователь
 
Регистрация: 26.12.2008
Сообщений: 50
По умолчанию работа с потоками

Код:
uses
windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, syncobjs;

type
tform1 = class(tform)
button1: tbutton;
memo1: tmemo;
procedure formcreate(sender: tobject);
procedure formdestroy(sender: tobject);
procedure button1click(sender: tobject);
private
{ private declarations }
public
{ public declarations }
end;

tnew = class(tthread)
protected
procedure execute; override;
end;

var
form1: tform1;
cs: tcriticalsection;
new1, new2: tnew;
mas: array of integer;

implementation

{$r *.dfm}

procedure tform1.formcreate(sender: tobject);
begin
setlength(mas,1);
mas[0] := 6;
// Создаем критическую секцию
cs := tcriticalsection.create;
end;

procedure tform1.formdestroy(sender: tobject);
begin
// Удаляем критическую секцию
cs.free;
end;

{ tnew }
procedure tnew.execute;
var
i: integer;
n: integer;
begin
for i := 1 to 10 do
begin
// Вход в критическую секцию
cs.enter;
// Код, выполнение которого параллельно запрещено
n := length(mas);
form1.memo1.lines.add(inttostr(mas[n-1]));
sleep(5);
setlength(mas,n+1);
mas[n] := mas[n-1]+1;
// Выход из критической секции
cs.leave;
end;
end;

procedure tform1.button1click(sender: tobject);
begin
new1 := tnew.create(true);
new1.freeonterminate := true;
new1.priority := tpidle;
new2 := tnew.create(true);
new2.freeonterminate := true;
new2.priority := tptimecritical;
new1.resume;
new2.resume;
end;

end.
взято отсюда: http://www.interface.ru/home.asp?artId=6105

не совсем понял как работать с потоками, поясните пару моментов пожалуйста

я так понял код, выполняемый в потоке записывается в процедуру execute, т.е. для одного потока создается один класс? или можно все таки одним классом описать 6-7 потоков(с разным кодом)? если первый вариант то получается критическая секция создается отдельно от класса, и в каждой процедуре execute мы в ходим в общую критическую секцию и выходим из нее для синхронизации?
в данном примере 2 потока выполняют один и тот же код?
MetR вне форума Ответить с цитированием
Старый 04.12.2011, 01:32   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> код, выполняемый в потоке записывается в процедуру execute

да

> для одного потока создается один класс?

скорее, для одного типа потока. Т.е. однотипные действия можно выполнять во многих потоках, для этого нужен будет 1 класс и несколько его инстансов (по одному на поток).
Для потока другого типа обычно создают другой класс. Но можно всё объединить и в одном.

> или можно все таки одним классом описать 6-7 потоков(с разным кодом)?

можно, но особого смысла в этом нет

> в каждой процедуре execute мы в ходим в общую критическую секцию

критической секцией оборачивается тот код, который запрещено выполнять из нескольких потоков одновременно. Возможно, у вас такого кода и не будет, так что секция и не понадобится.

> в данном примере 2 потока выполняют один и тот же код?

да, причём код с ошибкой. Вот эта строчка:

Код:
form1.memo1.lines.add(inttostr(mas[n-1]));
рано или поздно завалит вашу программу.
С VCL можно работать только в контексте главного потока.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками QuadroX Помощь студентам 10 20.09.2011 14:24
работа с потоками SHtirlic1 Общие вопросы Delphi 10 15.03.2011 20:03
Работа с потоками gagarin0 Win Api 4 05.11.2010 02:30
Работа с потоками gagarin0 Помощь студентам 0 28.10.2010 22:12
Работа с потоками Нюська Общие вопросы Delphi 3 27.05.2009 00:52