Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Простой вопрос по потокам (как его чёрт возьми запустить) [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;

и вызывай эту процедуру.


Наверх

Титульная страница Поиск, карта сайта Написать письмо