Форум: "WinAPI";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
ВнизКак запустить еще один поток? Найти похожие ветки
← →
Frogkiller (2002-02-28 10:47) [0]Подскажите плз, как создать еще один поток. То есть я все делаю как надо (как мне кажется), а код не компилируется - выдает ошибку, причем разную (в зависимости от того как подключишь модули). Существует 4 варианта:
1. В модуле main (основной поток) в раздел uses добавляю MyThread (дополнтельный поток), а в модуле MyThread туда же - main. Результат: ошибка циклической связи в модуле main (или что-то в этом роде).
2. В модуле main в раздел uses добавляю MyThread, а в модуле MyThread - ничего. Результат: Undeclared identifier: "Form1" в модуле MyThread.
3. В модуле MyThread в раздел uses добавляю main, а в модуле main - ничего. Результат: Undeclared identifier: "TCountObj" в модуле main.
4. Ни в одном ни в другом модуле в uses ничего не добавляю. Результат: см. п.2+п.3.
Что мне делать?
Коды:
Основной поток:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, MyThread;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
co: TCountObj;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button2Click(Sender: TObject);
begin
co:=TCountObj.Create(true);
co.Resume;
co.Priority:=tpLower;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
co.Terminate;
co.Free;
end;
end.
Дополнительный поток:
unit MyThread;
interface
uses
Classes, main;
type
TCountObj = class(TThread)
private
{ Private declarations }
index: integer;
procedure UpdateLabel;
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TCountObj.UpdateCaption;
begin
Form1.Caption := "Updated in a thread";
end; }
{ TCountObj }
procedure TCountObj.Execute;
begin
{ Place thread code here }
index:=1;
while index>0 do
begin
Synchronize(UpdateLabel);
Inc(index);
if index>100000 then
index:=0;
if terminated then exit;
end;
end;
procedure TCountObj.UpdateLabel;
begin
Form1.Label1.Caption:=IntToStr(Index);
end;
end.
Зарание спасибо.
← →
Юрий Зотов (2002-02-28 12:45) [1]Остановитесь на первом варианте, но хотя бы в одном из модулей (в любом, но, судя по коду, удобнее будет в MyThread) ссылку на другой модуль надо прописать в uses в секции implementation, а не interface. Такие ссылки циклическими не считаются.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c