![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Главный модуль:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Unit2; type TForm1 = class(TForm) RichEdit1: TRichEdit; Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MyThread.Start; end; end. Код:
unit Unit2; interface uses Classes, SysUtils; type TMyThread = class(TThread) protected procedure Execute; override; end; var MyThread: TMyThread; i: integer; implementation uses Unit1; procedure UpLab; begin Form1.Label1.Caption := IntToStr(i); end; procedure TMyThread.Execute; begin i := 0; while True do begin i := i + 1; Synchronize(UpLab); if i > 100000 then Break; end; end; initialization MyThread := TMyThread.Create(True); MyThread.Priority := tpLower; finalization MyThread.Free; end. Последний раз редактировалось Admin, 05.06.2011 в 18:57. |
#2
|
||||
|
||||
![]() поток нельза запустить повторно. решение: разрушить предыдущий экземпляр и создать новый. да, и что за "Start" такое?
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
SpectraL (06.03.2015)
|
#3
|
||||
|
||||
![]() Цитата:
Цитата:
|
#4
|
||||
|
||||
![]() Главный модуль:
Цитата:
Цитата:
2. При использовании ПЕРВОГО ВАРИАНТА, приложение, после закрытия главного окна, завершается нормально. Всё ли нормально в исходном коде, в данном случае, или может быть лучше вызвать MyThread.Terminate в главном модуле в разделе finalization? |
#5
|
||||
|
||||
![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyThread = class(TThread) private i: Integer; procedure Updt; protected procedure Execute; override; end; TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FMyThread: TMyThread; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TMyThread } procedure TMyThread.Execute; begin i:=0; while not Terminated do begin Synchronize(Updt); Inc(i); if i>100 then Break; Sleep(50); end; end; procedure TMyThread.Updt; begin Form1.Label1.Caption:=IntToStr(i); end; { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin FormDestroy(Sender); FMyThread:=TMyThread.Create(True); FMyThread.FreeOnTerminate:=False; FMyThread.Resume; end; procedure TForm1.FormDestroy(Sender: TObject); begin if FMyThread<>nil then begin FMyThread.Terminate; FMyThread.WaitFor; FreeAndNil(FMyThread); end; end; end. обработчики: Button1.OnClick:=Button1Click; OnDestroy:=FormDestroy; Пишу программы за еду. __________________ |