Форум: "Начинающим";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизПростой вопрос по потокам (как его чёрт возьми запустить) Найти похожие ветки
← →
alexandr-m © (2005-08-15 16:03) [0]Создал простейшее приложение, форма на ней одна кнопка.
Затем добавляю в проект 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.
← →
alex-drob © (2005-08-15 16:13) [1]Точно не знаю, но помоему из procedure testthread.Execute нелзя обращаться напрямую к форме.
Раскаментируй
procedure testthread.UpdateCaption;
begin
Form1.Caption := "Updated in a thread";
end;
и вызывай эту процедуру.
← →
alexandr-m © (2005-08-15 16:17) [2]как вызывать???
← →
alexandr-m © (2005-08-15 16:19) [3]раскоментировал, даёт ошибку undeclared identifier "UpdateCaption"
← →
Eraser © (2005-08-15 16:20) [4]alexandr-m © (15.08.05 16:17) [2]
Synchronize(UpdateCaption);
← →
Gydvin © (2005-08-15 16:21) [5]http://delphimaster.net/view/2-1123470571/
Может поможет
← →
alex-drob © (2005-08-15 16:22) [6]procedure testthread.Execute;
begin
SetName;
Synchronize(UpdateCaption);
end;
← →
alexandr-m © (2005-08-15 16:38) [7]кто нибудь может привести исправленные unit1 и unit2 чтобы этот элементарный пример заработал?
← →
alexandr-m © (2005-08-15 16:51) [8]спасибо Gydvin всё заработало!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c