Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: CL | DM;

Вниз

Thread   Найти похожие ветки 

 
Птущенко Денис ©   (2003-05-09 08:38) [0]

Допустим я выполняю какой-то цикл, но пока он не выполнится все другие процессы программы останавливаюся.
Вопрос: Как создать поток и чтоб этот цикл выполнялся в нем параллельно с другими процессами и не мешал им ?
Заранее спасибо.


 
german goering   (2003-05-09 10:45) [1]

Че-то вроде ответ в заголовке поста, или вопрос в том, как это реализовать?


 
Птущенко Денис ©   (2003-05-09 10:59) [2]

Да, как это реализовать ?


 
german goering   (2003-05-09 11:00) [3]

Ага
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

TMyThread = class(TThread)
private
FCount: Integer;
FResult: Integer;
protected
procedure Execute; override;
public
constructor Create(Count: Integer);
property Result: Integer read FResult;
property Count: Integer read FCount;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure OnTerminateThread(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1; {$R *.dfm}

implementation

{ TMyThread }

constructor TMyThread.Create;
begin
inherited Create(False);
FCount := Count;
FreeOnTerminate := True;
end;

procedure TMyThread.Execute;
var I: Integer;
begin
for I := 0 to FCount do FResult := FResult + Random(FCount);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
begin
Button1.Caption := "";
Button1.Enabled := False;
TMyThread.Create(2000).OnTerminate := OnTerminateThread;
for I := 0 to 10000 do
begin
Application.ProcessMessages;
Caption := IntToStr(I);
end;
Button1.Enabled := True;
ShowMessage("Main cicle finished");
end;

procedure TForm1.OnTerminateThread(Sender: TObject);
begin
Button1.Caption := IntToStr(TMyThread(Sender).Result);
ShowMessage("MyThread is terminated");
end;

end.

?


 
german goering   (2003-05-09 11:05) [4]

В конструкторе
constructor TMyThread.Create;
begin
inherited Create(False);
FCount := Count;
FreeOnTerminate := True;
end;

inherited Create(False); - означает, начнет ли поток выполняться сразу после его создания, в противном сл-е, (True), необходимо вызвать метод Resume для выполнения метода Execute.

FreeOnTerminate := True; - обеспечивает уничтожение экземпляра TMyThread после завершения его работы.


 
Verg ©   (2003-05-10 12:01) [5]

Вставь в цикл sleep(0)


 
Diamond Cat ©   (2003-05-11 15:28) [6]


> Verg © (10.05.03 12:01)
> Вставь в цикл sleep(0)
БРАВО....



Страницы: 1 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
1-31291
Antonyan
2003-06-26 15:06
2003.07.10
Индустриальные VCL


3-31149
Oleg
2003-06-18 17:39
2003.07.10
Ошибка из-за индекса


14-31416
CrazyHackers
2003-06-25 19:03
2003.07.10
Ускорить DbGrid


14-31515
KSergey
2003-06-25 12:19
2003.07.10
Слишком большой объем htlm-страниц сайта и форума


7-31558
DeadMeat
2003-03-31 21:03
2003.07.10
Защита софта