Форум: "Основная";
Текущий архив: 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.009 c