![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#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-х параметров? Может ещё какие будут варианты объяснения кроме случайности? Если кто что толкового подскажет, буду признателен. ![]() |
![]() |
![]() |
![]() |
#2 | |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
![]()
А что значит
if dwTime = 0 then beep; ??? Цитата:
Вообще Х/З, попробуй передать ей хендл окна и timerID
пыщь
|
|
![]() |
![]() |
![]() |
#3 |
Любитель
Пользователь
Регистрация: 29.05.2007
Сообщений: 16
|
![]()
Дружище, ты создаешь таймер без родителя!
Пиши следующее: const TimerId = 1; var Time : Integer = 1000; begin SetTimer(Form1.Handle, TimerId, Time, @Func); end; И не забудь в своей callback-функции поставить stdcall. Должно работать.
Хочешь рассмешить Бога, расскажи ему о планах на завтра…
|
![]() |
![]() |
![]() |
#4 | |
Новичок
Джуниор
Регистрация: 29.05.2007
Сообщений: 2
|
![]() Цитата:
Насчёт stdcall. Да, всё работает, единственно меня интересует, почему? Потомучто моя MyFunc является API-шной функцией? И ещё вопрос, почему в 98-ой винде всё работает нормально без stdcall? |
|
![]() |
![]() |
![]() |
#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 |