![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Разработать визуальное приложение , в котором работают параллельно два потока.
Код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses windows,
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
function ThreadFunc(Parameter: Pointer): Integer;
var
y,x: double;
begin
x:=random;
y:=(2*cos(x-pi/6))/(0.5+sqr(sin(x)));
Form1.Memo1.Lines.Append(format('%5.2f - %5.2f',[x,y]));
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
tid: DWORD; i:integer;
begin
for i:=0 to 10 do
BeginThread(nil, 0, @ThreadFunc, nil, 0, tid);
end;
end.Последний раз редактировалось M.A.D.M.A.N., 28.03.2014 в 18:20. |
|
#2
|
|||
|
|||
|
А ничего, что оба вычисления будут проведены практически мгновенно?
Код:
type
TForm1 = class(TForm)
...
end;
TThread1 = class(TThread)
res : Integer;
procedure Execute; override;
end;
TThread2 = class(TThread)
x : double
res : Double;
procedure Execute; override;
end;
implementation
procedure TThread1.Execute;
var
I : Integer;
begin
res := 0;
For I := 1 To 100 Do res := res + I;
end;
procedure TThread2.Execute;
begin
res := (2*cos(x-pi/6))/(0.5+sqr(sin(x)));
end;
procedure TForm1.Button1Click(Sender : TObject);
var
T1 : TThread1;
T2 : TThread2;
begin
T1 := TThread1.Create(True);
T2 := TThread2.Create(True);
T2.x := 15.8;
T1.Resume;
T2.Resume;
T1.WaitFor;
T2.WaitFor;
Memo1.Lines.Clear;
Memo1.Lines.Add('Sum = ' + IntToStr(T1.res));
Memo2.Lines.Add('Func = ' + FloatToStr(T2.res));
T1.Free;
T2.Free;
end; |
|
#3
|
|||
|
|||
|
Люди объясните пожалуйста почему код приведенный выше при запуке блокирует основной поток, то есть если запустить бесконечный цикл (да и вообще какой нибудь длительное действие в потоке) интерфейс программы зависает наглухо... Как я понял эти потоки не самостоятельные что ли?
|
|
#4
|
||||
|
||||
|
Цитата:
Код:
T1.WaitFor; T2.WaitFor; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
saylar_06 (27.03.2014)
| ||
|
#5
|
|||
|
|||
|
А как тогда быть? просто в этом коде все так наглядно... Если закомментировать строчку то поток вообще не работает
|
|
#6
|
||||
|
||||
|
Цитата:
Код:
while not T1.Terminated or not T2.Terminated do
begin
Sleep(100); // Небольшая задержка чтобы не "жрать" весь процессор
Application.ProcessMessages; // Обрабатываем накопившиеся сообщения в основном потоке
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
saylar_06 (27.03.2014)
| ||
|
#7
|
|||
|
|||
|
Спасибо, теперь пытаюсь после T1.Free; вызвать ShowMessage('done'); но ничего не происходит и при попытке закрыть форму программа зависает, пытался T1.Terminate; но что то не вышло
![]() Как же все таки завершить поток? приложение виснет после попытки закрытия Последний раз редактировалось M.A.D.M.A.N., 28.03.2014 в 18:20. |
|
#8
|
||||
|
||||
|
TerminateThread
|
|
#9
|
||||
|
||||
|
Цитата:
Или же, как вариант, реализовать ожидание завершения потоков через WaitForMultipleObjects вместо проверки свойства "Terminated". |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
saylar_06 (28.03.2014)
| ||
|
#10
|
|||
|
|||
|
deleted...
|