|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.05.2007, 10:54 | #1 |
Новичок
Джуниор
Регистрация: 29.05.2007
Сообщений: 2
|
Вызов функции по таймеру
Привет, народ! Вот тут упёрся в одну проблемку, может вы поможете разобрать и решить.
Работаю на Delphi 5 и вот наткнулся на такую ситуацию. Есть у меня одна функция и мне её надо вызвать спустя какой-то интервал времени, делаю это с помощью SetTimer. В чём странность? Так вот: в 98-ой винде работает всё нормально. В XP функция таймера срабатывает дважды, а в 2000-ой мало того что срабатывает функция дважды, так после второго завершения программа вылетает с исключением "Access violation", притом не важно что выполняется в функции(процедуре) вызываемой по таймеру. Приведу приметивнейший пример Код:
Очень важно узнать почему так? Может здесь какая-то несовместимость Delphi 5 и Windows 2000(и выше)? И как тогда выкручиваться при использовании SetTimer в Delphi 5, так как программа должна быть универсальной и работать как под 98-ой, как под 2000-ой и др одинаково? Как я понял : Моя процедура MyFunc является callback API-шной и следовательно нуждается в директиве stdcall. Если я понял что-то не так - поправьте, пожалуйста. Но всё же остаётся открытым вопрос, почему в Windows 98 эта функция работатет нормально без stdcall, хоть в ней и больше 3-х параметров? Может ещё какие будут варианты объяснения кроме случайности? Если кто что толкового подскажет, буду признателен. |
29.05.2007, 14:41 | #2 | |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
А что значит
if dwTime = 0 then beep; ??? Цитата:
Вообще Х/З, попробуй передать ей хендл окна и timerID
пыщь
|
|
29.05.2007, 16:29 | #3 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
Дружище, ты создаешь таймер без родителя!
Пиши следующее: const TimerId = 1; var Time : Integer = 1000; begin SetTimer(Form1.Handle, TimerId, Time, @Func); end; И не забудь в своей callback-функции поставить stdcall. Должно работать.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
30.05.2007, 13:57 | #4 | |
Новичок
Джуниор
Регистрация: 29.05.2007
Сообщений: 2
|
Цитата:
Насчёт stdcall. Да, всё работает, единственно меня интересует, почему? Потомучто моя MyFunc является API-шной функцией? И ещё вопрос, почему в 98-ой винде всё работает нормально без stdcall? |
|
30.05.2007, 22:47 | #5 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
С точки зрения системы - обыкновенная функция, в которую передается набор параметров в определённой последовательности (последовательность указывается явно с помощью stdcall). Вообще, отправляю автора вопроса к чтению MS SDK по Callback-функциям.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вызов функции | MarSeON | PHP | 2 | 01.08.2008 20:22 |
Visual Basic, рисование по таймеру | Arion | Помощь студентам | 5 | 21.05.2008 12:42 |
Вызов процедуры при обьявлении функции | ivannikov | Общие вопросы Delphi | 6 | 12.03.2008 13:20 |
Нечто подобное таймеру | Артэс | Общие вопросы C/C++ | 8 | 11.02.2008 19:19 |
Автоматический вызов функции класса | Flaton | Общие вопросы C/C++ | 4 | 19.10.2007 17:56 |