Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Работа с потоками в компонентах.   Найти похожие ветки 

 
Gear   (2004-07-31 13:28) [0]

Добрый день! Подскажите пожалуйста как сделать правильно. Имеем код КОМПОНЕТА(!):



uses mmsystem,Windows...
type
 TAUD = class(TComponent)
 private
   { Private declarations }
   Facmin: Tacmin;
   Facmout: Tacmout;
   ...
 protected
   { Protected declarations }
 public
   { Public declarations }

   constructor Create(AOwner: TComponent); override;
   destructor Destroy;override;
   ...
 published
   { Published declarations }
   ...
end;

type
 TAUDThread = class(TThread)
 protected
   procedure Execute; override;
   procedure DoWork;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("Sample", [TAUD]);
end;

constructor TAUD.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Facmin := Tacmin.Create(self);
 Facmout := Tacmout.Create(self);
 ...
end;

procedure TRTPThread.Execute;
begin
 Synchronize(DoWork);
end;

procedure TRTPThread.DoWork;
var
bCntinue:boolean;
date,lenght:PByte;
begin
...
bContinue:=true;
 while ( bContinue ) do
 begin
   ...
   //вот тут затык...мне нужно в потоке запускать цикл с функцией FACMOut.Play которая объявлена в TAUD однако FACMout невидна %(
   TAUD.FACMOut.Play(date,lenght);
   ...
 end;
...
end.


Мне нужно в потоке запускать цикл с функцией FACMOut.Play которая объявлена в TAUD однако FACMout невидна %(. Что я делаю не так? Компилятор говорит Method identifier expected


 
Gear   (2004-07-31 13:30) [1]

Пардон ошибки. Вот так вот лучше:

uses mmsystem,Windows...
type
TAUD = class(TComponent)
private
  { Private declarations }
  Facmin: Tacmin;
  Facmout: Tacmout;
  ...
protected
  { Protected declarations }
public
  { Public declarations }

  constructor Create(AOwner: TComponent); override;
  destructor Destroy;override;
  ...
published
  { Published declarations }
  ...
end;

type
TAUDThread = class(TThread)
protected
  procedure Execute; override;
  procedure DoWork;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Sample", [TAUD]);
end;

constructor TAUD.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Facmin := Tacmin.Create(self);
Facmout := Tacmout.Create(self);
...
end;

procedure TAUDThread.Execute;
begin
Synchronize(DoWork);
end;

procedure TAUDThread.DoWork;
var
bContinue:boolean;
date,lenght:PByte;
begin
...
bContinue:=true;
while ( bContinue ) do
begin
  ...
  //вот тут затык...мне нужно в потоке запускать цикл с функцией FACMOut.Play которая объявлена в TAUD однако FACMout невидна %(
  TAUD.FACMOut.Play(date,lenght);
  ...
end;
...
end.


Где закралась ошибка?


 
Sun bittern ©   (2004-07-31 13:37) [2]

Не верен подход сразу!
Наверно лучше сделать в самом компоненте поле типа TThread и с ним уже работать.
А пример с потоками случаем не из здешних статей?


 
KSergey ©   (2004-07-31 13:39) [3]

>  TAUD.FACMOut.Play(date,lenght);

Я не понял: это что??

> объявлена в TAUD

В классе? А экземпляр этого класса - пушкин будет создавать? Или я что-то не понимаю?

> procedure TAUDThread.Execute;
> begin
> Synchronize(DoWork);
> end;

Слов нет.. :(


 
Gear   (2004-07-31 13:41) [4]

а каим образом? пожалуйста,приведите пример применительно для этого случая если можно.


 
Sun bittern ©   (2004-07-31 13:55) [5]

Gear   (31.07.04 13:41) [4]

Задачу подробней обрисуй!


 
Gear   (2004-07-31 23:38) [6]

Задача в том, чтобы в компоненте TAUD бесконечный цикл

...
while ( bContinue ) do
begin
 ...
 //вот тут затык...мне нужно в потоке запускать цикл с функцией FACMOut.Play которая объявлена в TAUD однако FACMout невидна %(
 TAUD.FACMOut.Play(date,lenght);
 ...
end;

..выполнялся в отдельном потоке. Иначе, если этот цикл начинает выполнятся то дальше уже я естественно не могу работать с другими функциями этого компонента пока этот цикл не остановишь. Я решил этот цикл вывести в отдельный поток. Прав я или нет незнаю.


 
Gear   (2004-07-31 23:58) [7]

To KSergey:
экземпляр  TAUD зачем создавать когда это компонент???или я что то непонимаю? Мне компонент нужен с возможностью выделить в нём бесконечный цикл в отдельный поток и всё.Как это сделать я незнаю :(


 
KSergey ©   (2004-08-01 09:21) [8]

Чета рано вы за потоки взялись.
Читните для начала тут (чтобы в терминах не путаться)
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=342


 
Sun bittern ©   (2004-08-01 09:46) [9]

TMyComp = class;

 TMyThread = class(TThread)
 private
   FMyComp: TMyComp;
 protected
   procedure Execute; override;
 public
   constructor Create(AMyComp: TMyComp);
   destructor Destroy; override;
 end;

 TMyComp = class(TComponent)
 private
   FActive: Boolean;
   FThread: TMyThread;
   FValue: Integer;
   procedure SetActive(const Value: Boolean);
 protected
   procedure RandomValue;
 public
   constructor Create(AOwner : TComponent);
   destructor Destroy; override;
 published
   property Active: Boolean read FActive write SetActive default True;
   property Value: Integer read FValue;
 end;

{ TMyThread }

constructor TMyThread.Create(AMyComp: TMyComp);
begin
 inherited Create(True);
 FMyComp := AMyComp;
 Suspended := False;
end;

destructor TMyThread.Destroy;
begin

 inherited Destroy;
end;

procedure TMyThread.Execute;
begin
 Repeat
   FMyComp.RandomValue;
 until Terminated;
end;

{ TMyComp }

constructor TMyComp.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FThread := TMyThread.Create(Self);
 FActive := True;
end;

destructor TMyComp.Destroy;
begin
 FThread.Terminate;
 inherited Destroy;
end;

procedure TMyComp.RandomValue;
begin
 repeat
   FValue := Random(300);
 until FValue = 400;
end;

procedure TMyComp.SetActive(const Value: Boolean);
begin
 if FActive <> Value then
 begin
   FActive := Value;
   FThread.Suspended := not FActive;
 end;
end;


 
Sun bittern ©   (2004-08-01 12:05) [10]

{ TMyComp }
constructor Create(AOwner : TComponent); override;


 
Gear   (2004-08-01 12:54) [11]

Спасибо большое Sun bittern! Вы мне помогли. Всё получилось.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1091454495
Dysan
2004-08-02 17:48
2004.08.15
почему возникает ошибка...


14-1090507038
banderas
2004-07-22 18:37
2004.08.15
Delphi 8 ваши впечатления:..


14-1090935165
DSKalugin
2004-07-27 17:32
2004.08.15
Частные заказы (соцопрос)


1-1091453856
Andrey
2004-08-02 17:37
2004.08.15
Outlook Express


1-1091166407
П7
2004-07-30 09:46
2004.08.15
Элементы TTreeView и Drag n Drop





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский