![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Простой вопрос по потокам (как его чёрт возьми запустить) [D7]
alexandr-m © (2005-08-15 16:03:00)Создал простейшее приложение, форма на ней одна кнопка.
Затем добавляю в проект Thread Object:
File -> New -> Other -> Thread Object
в нём в теле экзекуции добавляю то что мне нужно сделать в этом потоке: Form1.Caption := 'Updated in a thread';
Вопрос: что мне нужно написать в кнопке на Form1 чтобы запустить на выполнение этот поток??
далее читаю в документации:
>Приоритеты имеют значения от 0 до 31. Приоритет потока может >отличаться от приоритета породившего его процесса на плюс-минус >две единицы.
а где эту чифру вписывать они как всегда написать забыли.
ниже исходный код того приложения которое я создал:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
что сдесь написать?
end;
end.
***************************************************************
unit Unit2;
interface
uses
Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};
type
testthread = class(TThread)
private
procedure SetName;
protected
procedure Execute; override;
end;
implementation
uses unit1;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure testthread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{$IFDEF MSWINDOWS}
type
TThreadNameInfo = record
FType: LongWord; // must be 0x1000
FName: PChar; // pointer to name (in user address space)
FThreadID: LongWord; // thread ID (-1 indicates caller thread)
FFlags: LongWord; // reserved for future use, must be zero
end;
{$ENDIF}
{ testthread }
procedure testthread.SetName;
{$IFDEF MSWINDOWS}
var
ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
ThreadNameInfo.FType := $1000;
ThreadNameInfo.FName := 'changecaption';
ThreadNameInfo.FThreadID := $FFFFFFFF;
ThreadNameInfo.FFlags := 0;
try
RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
except
end;
{$ENDIF}
end;
procedure testthread.Execute;
begin
SetName;
{ Place thread code here }
Form1.Caption := 'Updated in a thread';
end;
end.
alexandr-m (2005-08-15 16:51:00) [1]спасибо Gydvin всё заработало!
alexandr-m (2005-08-15 16:38:00) [2]кто нибудь может привести исправленные unit1 и unit2 чтобы этот элементарный пример заработал?
alex-drob (2005-08-15 16:22:00) [3]procedure testthread.Execute;
begin
SetName;
Synchronize(UpdateCaption);
end;
Gydvin (2005-08-15 16:21:00) [4]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1123470571&n=18
Может поможет
Eraser (2005-08-15 16:20:00) [5]alexandr-m © (15.08.05 16:17) [2]
Synchronize(UpdateCaption);
alexandr-m (2005-08-15 16:19:00) [6]раскоментировал, даёт ошибку undeclared identifier 'UpdateCaption'
alexandr-m (2005-08-15 16:17:00) [7]как вызывать???
alex-drob (2005-08-15 16:13:00) [8]Точно не знаю, но помоему из procedure testthread.Execute нелзя обращаться напрямую к форме.
Раскаментируй
procedure testthread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
и вызывай эту процедуру.