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

Вниз

Не происходит события 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
1-89942
Pert
2003-11-17 21:29
2003.11.27
из Edit a в переменную


3-89711
frogl
2003-11-09 11:26
2003.11.27
Записть полей типа text в MS SQL


1-89887
Vladislav
2003-11-15 15:32
2003.11.27
TreeView как в Outlook Express


1-89983
Radik
2003-11-17 13:58
2003.11.27
Временные интервалы


8-90005
Darlock
2003-07-23 14:20
2003.11.27
Проблемы с JPEG





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