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

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

Как правильно вызывать поток ?


SemFLY ©   (2002-07-14 02:22:00) 

В хелпе сказано с помощью Create, но у меня выскакивает ошибка
Access violation at address 00414234....
-------------------------------------------
Вот основная программа:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Lame : TThread;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Lame.Create(False); // тут я запускаю поток
end;

end.

----------------------------------------------

Вот отдельный поток:

unit Unit2;

interface

uses
Classes, Dialogs;

type
Lame = class(TThread)
private
{ Private declarations }
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 Lame.UpdateCaption;
begin
Form1.Caption := "Updated in a thread";
end; }

{ Lame }

procedure Lame.Execute;
begin
ShowMessage("TThread Start ! ");
end;

end.


SemFLY   (2002-07-14 14:57:00) [1]

Ясно !
-------
Спасибо ! :)))


Юрий Зотов   (2002-07-14 14:39:00) [2]

Потому что стандартные диалоги Delphi должны работать в контексте главного потока. Либо вызывайте их через Synchronize, либо не используйте совсем, а используйте API-шную MessageBox с нулем в первом параметре и флагом MB_TASKMODAL.


SemFLY   (2002-07-14 13:56:00) [3]

Юрий, Спасибо огромное ! :)))
Всё работает.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Тут по ходу появился ещё вопрос, почему при добавление в отдельный поток модуля Dialogs, поток в свою очередь не может вызвать ShowMessage и MessageDlg ?
Пишет ошибку: EInvalidOperation with message "Canvas does not allow drawing"
Как можно этого избежать и получить окошко с сообщением ?


Юрий Зотов   (2002-07-14 03:09:00) [4]

...
ALame: Lame; // !!!
...

procedure TForm1.Button1Click(Sender: TObject);
begin
ALame := Lame.Create(False); // !!!
end;


Наверх

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