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

Вниз

Не происходит события ONTIMER   Найти похожие ветки 

 
malefik ©   (2003-11-18 09:03) [0]

Создал Thread
В Execute .....
_ErrTimer := TTimer.Create(nil);
_ErrTimer.Interval := 300;
_ErrTimer.OnTimer := OnTimer;
_ErrTimer.Enabled := true;

в обьявлениях

procedure OnTimer(Sender: TObject);

сам обработчик...

procedure _TfibThread.OnTimer(Sender: TObject);
begin
_err := 0;
Synchronize (_showError);
end;

Ну не срабатывает он хоть убей.....что неправильно????


 
Семен Сорокин ©   (2003-11-18 09:15) [1]

зачем таймер:

while not Terminated do begin
Sleep(300);
_err := 0;
Synchronize (_showError)
end;


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


 
Digitman ©   (2003-11-18 09:16) [2]


> Ну не срабатывает он хоть убей.....что неправильно????


метод Execute не содержит (кроме всего прочего) самого главного : цикла ожидания/выборки/диспетчеризации оконных сообщений


 
Malefik ©   (2003-11-18 09:19) [3]

У меня в Execute куча мала крутится.....не стал показывать....просто убрал все лишнее....до такого кода он не работает тоже....МНЕ НУЖНО СОБЫТИЕ ТАЙМЕРА!!!!

в конце EXECUTE писал

a := 1;
repeat
until a >2;

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


 
Digitman ©   (2003-11-18 09:19) [4]

var
Msg: TMsg;
...
_ErrTimer := TTimer.Create(nil);
try
_ErrTimer.Interval := 300;
_ErrTimer.OnTimer := OnTimer;
_ErrTimer.Enabled := true;

while not Terminated and GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);
finally
_ErrTimer.Free;
end;


 
Владислав ©   (2003-11-18 09:19) [5]

А на кой таймер в отдельном потоке? Кинь его на форму, и будет тебе счастье.


 
malefik ©   (2003-11-18 09:20) [6]

>DIGITMAN >>> это получается что я не могу обработать ни одно событие ни какого компонента???


 
Digitman ©   (2003-11-18 09:22) [7]

destructor Destroy; override;

...

procedure _TfibThread.Destroy;
begin
if GetCurrentThreadId <> MainThreadId then
PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
inherited;
end;

var
Msg: TMsg;
...
_ErrTimer := TTimer.Create(nil);
try
_ErrTimer.Interval := 300;
_ErrTimer.OnTimer := OnTimer;
_ErrTimer.Enabled := true;

while not Terminated and GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);

finally
_ErrTimer.Free;
end;


 
Digitman ©   (2003-11-18 09:23) [8]


> malefik


не выдумывай. все оч даже замечательно получается.


 
malefik ©   (2003-11-18 09:28) [9]

Это был ответ на первое Сообщение ......не думал что сразу так быстро ответят!!!


 
malefik ©   (2003-11-18 09:29) [10]

Можно поподробнее описание последнего кода????
Особенно
while not Terminated and GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);


 
Digitman ©   (2003-11-18 09:37) [11]

это и есть вышеупомянутый цикл

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

в случае с осн.код.потоком и использованием объекта TApplication Борланд уже позаботился о таком цикле в методе Application.Run

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


 
malefik ©   (2003-11-18 09:39) [12]

У меня созданы оьекты не только таймера .....есть несколько сторонних обьектов (компонент) ....как обработать их события????Подобным образом????


 
Digitman ©   (2003-11-18 09:52) [13]

речь здесь идет как минимум об объектах, создающих в ходе своей работы окна. Объект TTimer как раз и оздает окно, которому система при "тике" таймера будет посылать сообщение WM_TIMER, и как реакцию на это сообщение объект TTimer возбудит событие OnTimer().

но для того чтобы сообщение WM_TIMER было принято и обработано (в дан.случае - в виде тут же генерируемого события OnTimer), кодовый поток должен обращаться к очереди сообщений, адресованных ему и его окнам, на предмет ожидания и/или выборки этих сообщений. Что, собственно, и делает ф-ция GetMessage() (читай описание этой ф-ции). Если в очереди есть хотя бы одно сообщение, адресованное потоку или его окнам, и если это сообщение не WM_QUIT, GetMessage() вернет True, а инф-ция о самом принятом сообщении будет замисана в экз-р структуры Msg: TMsg. Далее можно проанализировать это сообщение и явно обработать его, но в простейшем случае можно и не заботиться об этом : просто скомандовать системе диспетчеризовать полученное сообщение (см. описание DispatchMessage), при этом система сама проанализирует структуру Msg и в зависисмости от хэндла окна, фигурирующего в принятой структуре, вызовет оконную процедуру того окна, которому послано это сообщение (в дан.случае это окно, созданное объектом TTimer). Оконная процедура в случае с объектом TTimer возбудит событие OnTimer() и вызовет процедуру его обработки, если она тобой назначена.

Вот и вся "кухня")


 
malefik ©   (2003-11-18 09:54) [14]

Удалено модератором


 
Digitman ©   (2003-11-18 09:56) [15]


> malefik


валяй)



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
1-89977
Шурик Ш
2003-11-18 18:02
2003.11.27
Как засунуть форму в dll-файл?


3-89698
GIL
2003-11-06 11:05
2003.11.27
Filtered по второму разу глючит


14-90102
Nick Denry
2003-11-01 13:14
2003.11.27
Кросплатформенность... ;-)


1-89889
don_dampster
2003-11-15 10:19
2003.11.27
Анализ сценариев


1-89865
Pirate
2003-11-16 09:24
2003.11.27
Client-Server, Socket, Port etc.