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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.008 c
14-27637
Knight
2003-09-19 11:02
2003.10.09
Sission и редирект в чём проблем?


14-27735
Кен
2003-09-16 05:45
2003.10.09
В Китае обнаружен холм, по склону которого вода течет вверх


3-27335
Saperxl
2003-09-19 14:09
2003.10.09
TField.LookupDataSet


14-27733
wnew
2003-09-19 22:32
2003.10.09
Есть ли связисты на форуме?


1-27525
User_OKA
2003-09-30 07:22
2003.10.09
TreeView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский