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