|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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... |