Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Как сделать, чтобы событие обрабатывал отдельный поток?   Найти похожие ветки 

 
Johnnie   (2003-09-29 15:44) [0]

Приветствую Мастера! Как можно сделать, чтобы событие определенного компонента, размещенного на форме:
...
TForm1 = class(TForm)
...
ComPort: TComPort;
procedure ComPortRxChar(Sender: TObject; Count: Integer);
...
обрабатывалось отдельным потоком. Как "описать поток и процедуру его исполнения"? Извините за ламерский вопрос. Зарание Спасибо.


 
big_bugzy   (2003-09-29 15:50) [1]

создай класс наследник от TThread
создай экземпляр объекта этого класса
и в событии компонента вызови метод Execute объекта класса наследника TThread


 
big_bugzy   (2003-09-29 15:54) [2]

unit frmObjects;

interface

uses ...
type
TMyThread(TThread)
protected
procedure Execute;override;
end;

...

implementation

...
TMyThread.Execute;
begin
//То что тебе нужно сделать
end;

procedure TfrObjects.Button1Click(Sender: TObject);
var Th:TMyThread;
begin
Th:=TMyThread.Create(False);
end;


 
Unknown   (2003-09-29 15:56) [3]

big_bugzy (29.09.03 15:50)
>>и в событии компонента вызови метод Execute объекта класса >>наследника TThread
Да но только результат будет не тот который вы ждете:)


 
big_bugzy   (2003-09-29 15:58) [4]

to Unknown почему??
до сих пор вроде все было как надо...


 
Johnnie   (2003-09-29 15:58) [5]

Не совсем понял.
>>и в событии компонента вызови метод Execute объекта класса >>наследника TThread
В этом случае по событию запускается поток( или нет)? А мне нужно, чтобы событие обрабатывалось в потоке. После запуска некоторой процедуры начинает несколько тасяч раз срабатывать это событие. И мне нужно, чтобы это событие обрабатывалось именно потоком.


 
big_bugzy   (2003-09-29 16:02) [6]

то что я написал это по событию запускается поток...


 
big_bugzy   (2003-09-29 16:04) [7]

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


 
Johnnie   (2003-09-29 16:04) [8]

>>big_bugzy спасибо. Но как сделать то что мне нужно?


 
Unknown   (2003-09-29 16:06) [9]

>>и в событии компонента вызови метод Execute
ну не сможете вы вызвать метод Execute хотя бы потому что он обьявляется в protected


 
Opuhshii   (2003-09-29 16:07) [10]

2Johnnie (29.09.03 15:44)
"...размещенного на форме"
хм,.. а может сразу не на форме?,. будет проще,..


 
y-soft ©   (2003-09-29 16:10) [11]

>Johnnie

Варианты могут быть разные, но лучше всего инициировать событие в отдельном потоке. Например примерно так (только сам принцип):

type
TReceiveEvent = procedureSender: TObject; Count: Integer) of object;
TComPort = class;

TReceiveThread = class(TThread)
private
fComPort : TComPort;
public
constructor Create(AOwner : TComPort);
procedure Execute; override;
end;

TComPort = class(...)
private
fReceiveThread : TReceiveThread;
fOnReceive : TReceiveEvent;
...
public
constructor Create;
destructor Destroy; override;
published
...
property OnReceive : TReceiveEvent
read fOnReceive write fOnReceive;
end;

...
constructor TComPort.Create;
begin
...
fReceiveThread := TReceiveThread.Create(Self);
...
end;

destructor TComPort.Destroy;
begin
...
if assigned(fReceivedThread) then
begin
fReceivedThread.Terminate;
fReceivedThread.Free;
end;
...
end;
...
constructor TReceiveThread.Create(AOwner : TComPort);
begin
...
fComPort := AOwner;
...
end;

procedure TReceiveThread.Execute;
var
Count : integer;
begin
while not Terminated do
begin
...
if assigned(fComPort.fOnReceive) then
fComPort.fOnReceive(fComPort, Count);
...
end;
end;


 
big_bugzy   (2003-09-29 16:12) [12]

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


 
big_bugzy   (2003-09-29 16:14) [13]

to Unknown
сорри, не правильно сказал, но исправил ведь...


 
Opuhshii   (2003-09-29 16:15) [14]

2y-soft © (29.09.03 16:10) [11]
может я чего-то недопонимаю, но возможно человеку стоит намекнуть что необязательно создавать в одном потоке то с чем хочется работать из другого,..


 
y-soft ©   (2003-09-29 16:19) [15]

>Opuhshii (29.09.03 16:15) [14]

В общем-то это общепринятая нормальная практика - разносить прием и передачу в отдельные потоки, а в первичном потоке обрабатывть взаимодействие с пользователем. А то, знаете, при интенсивном обмене приложение перестает реагировать на "мышку" и т.п.


 
Serginio666   (2003-09-29 16:21) [16]

Неплохая статейка
http://www.rsdn.ru/article/baseserv/threadpool.xml
И очень хорошая функция QueueUserAPC


 
Opuhshii ©   (2003-09-29 16:22) [17]

y-soft © (29.09.03 16:19) [15]
"а в первичном потоке обрабатывть взаимодействие с пользователем." - полностью согласен,..
извиняюсь немного промеж глаз просмотрел приведенный код,.


 
y-soft ©   (2003-09-29 16:27) [18]

>Opuhshii © (29.09.03 16:22) [17]

А в общем-то Вы совершенно правы - если объект невизуального класса используется только в одном потоке, то там и надо его создавать и уничтожать...


 
Johnnie   (2003-09-29 16:29) [19]

Извините, если я правильно понял, то общепринято создавать два потока один для приема, другой для передачи. Но у меня передача состоит из записи в порт одной команды. Поэтому выносить ее в отдельный поток наверное нет смысла. На счет второго потока:
принцип обработки приема в отдельном потоке дал y-soft ©.

Поскольку с потоками почти не работал - нужно время, чтобы переварить выше сказанное. Всем Спасибо, будут дальнейшие вопросы - всплыву.


 
y-soft ©   (2003-09-29 16:37) [20]

>Johnnie (29.09.03 16:29) [19]

Передавать можете и в первичном потоке.

А вот про необходимость синхронизации в обработчике события, если осуществляете вывод в первичный поток, не забывайте...



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

Текущий архив: 2003.10.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
3-27303
mfender
2003-09-20 22:49
2003.10.09
Откуда AccessViolation?


14-27698
Шишкин Илья
2003-09-19 14:02
2003.10.09
Работа с BASS


3-27309
ExE
2003-09-17 16:55
2003.10.09
Помогите не как не могу понять в чём дело


1-27594
daaap
2003-09-29 09:49
2003.10.09
Создание компонент


14-27745
nika_ufc
2003-09-19 18:06
2003.10.09
надоел этот английский , помогите :(