Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.03.2014, 16:22
pozer pozer вне форума
Прохожий
 
Регистрация: 11.03.2014
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Разработать визуальное приложение , в котором работают параллельно два потока.

Код:
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  
Старый 12.03.2014, 04:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,031
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А ничего, что оба вычисления будут проведены практически мгновенно?

Код:
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;
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо lmikle за это полезное сообщение:
pozer (12.03.2014), saylar_06 (27.03.2014)
  #3  
Старый 27.03.2014, 11:25
saylar_06 saylar_06 вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 33
Репутация: 10
По умолчанию

Люди объясните пожалуйста почему код приведенный выше при запуке блокирует основной поток, то есть если запустить бесконечный цикл (да и вообще какой нибудь длительное действие в потоке) интерфейс программы зависает наглухо... Как я понял эти потоки не самостоятельные что ли?
Ответить с цитированием
  #4  
Старый 27.03.2014, 11:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от saylar_06
Люди объясните пожалуйста почему код приведенный выше при запуке блокирует основной поток, то есть если запустить бесконечный цикл (да и вообще какой нибудь длительное действие в потоке) интерфейс программы зависает наглухо...
Ну дык из-за:
Код:
  T1.WaitFor;
  T2.WaitFor;
Они же в ожидании завершения параллельных потоков останавливают основной поток.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
saylar_06 (27.03.2014)
  #5  
Старый 27.03.2014, 11:35
saylar_06 saylar_06 вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 33
Репутация: 10
По умолчанию

А как тогда быть? просто в этом коде все так наглядно... Если закомментировать строчку то поток вообще не работает
Ответить с цитированием
  #6  
Старый 27.03.2014, 11:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от saylar_06
А как тогда быть? просто в этом коде все так наглядно... Если закомментировать строчку то поток вообще не работает
Можно, к примеру, вместо тех двух строк использовать такой цикл:
Код:
      while not T1.Terminated or not T2.Terminated do
      begin
        Sleep(100); // Небольшая задержка чтобы не "жрать" весь процессор
        Application.ProcessMessages; // Обрабатываем накопившиеся сообщения в основном потоке
      end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
saylar_06 (27.03.2014)
  #7  
Старый 27.03.2014, 14:06
saylar_06 saylar_06 вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 33
Репутация: 10
По умолчанию

Спасибо, теперь пытаюсь после T1.Free; вызвать ShowMessage('done'); но ничего не происходит и при попытке закрыть форму программа зависает, пытался T1.Terminate; но что то не вышло

Как же все таки завершить поток? приложение виснет после попытки закрытия

Последний раз редактировалось M.A.D.M.A.N., 28.03.2014 в 18:20.
Ответить с цитированием
  #8  
Старый 28.03.2014, 18:20
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

TerminateThread
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 28.03.2014, 18:48
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от saylar_06
Спасибо, теперь пытаюсь после T1.Free; вызвать ShowMessage('done'); но ничего не происходит и при попытке закрыть форму программа зависает, пытался T1.Terminate; но что то не вышло
Свойство "Terminated" действительно автоматически не устанавливается в "True" по завершению потока, поэтому в конце методов "Execute" нужно самостоятельно вызывать "Terminate" сигнализируя, что поток завершился.
Или же, как вариант, реализовать ожидание завершения потоков через WaitForMultipleObjects вместо проверки свойства "Terminated".
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
saylar_06 (28.03.2014)
  #10  
Старый 28.03.2014, 19:07
saylar_06 saylar_06 вне форума
Прохожий
 
Регистрация: 08.06.2012
Сообщения: 33
Репутация: 10
По умолчанию

deleted...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter