|
|
Регистрация | << Правила форума >> | 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
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
||||
|
||||
Цитата:
Или же, как вариант, реализовать ожидание завершения потоков через WaitForMultipleObjects вместо проверки свойства "Terminated". |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
saylar_06 (28.03.2014)
|
#10
|
|||
|
|||
deleted...
|