![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Привет, народ! Давно уже не заходил на форум. Вот тут упёрся в одну проблемку, может вы поможете разобрать и решить.
Работаю на Delphi 5 и вот наткнулся на такую ситуацию. Есть у меня одна функция и мне её надо вызвать спустя какой-то интервал времени, делаю это с помощью SetTimer. В чём странность? Так вот: в 98-ой винде работает всё нормально. В XP функция таймера срабатывает дважды, а в 2000-ой мало того что срабатывает функция дважды, так после второго завершения программа вылетает с исключением "Access violation", притом не важно что выполняется в функции(процедуре) вызываемой по таймеру. Приведу приметивнейший пример
Проведя некоторые исследования, я заметил такую особенность, если число параметров в вызываемой функции не превышает 3, то такой ситуации не возникает(из ассемблерного кода видно, что если в функции большех трёх параметров, то 4-ый и последующие уже передаются не через регистры, а через стэк). Ещё одна особенность, если процедуру MyFunc вызывать с соглашение stdcall, то тоже всё нормально. Очень важно узнать почему так? Может здесь какая-то несовместимость Delphi 5 и Windows 2000(и выше)? И как тогда выкручиваться при использовании SetTimer в Delphi 5, так как программа должна быть универсальной и работать как под 98-ой, как под 2000-ой и др одинаково? --------------------
Бери от жизни всё. |
|||
|
||||
| Palladin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 932 Регистрация: 15.5.2007 Где: Беларусь г.Гомель Репутация: 3 Всего: 17 |
Короче первое что пришло на ум то и пишу, вообще заводиш глобальную переменную к примеру x типа integer, и там же присваеваеш её начальное значение 0, после этого в условие таймера пишеш
Покатит Добавлено через 25 секунд Тогда будет выполнятся лиш один раз Добавлено через 1 минуту и 22 секунды Так же я не вижу весь код, да и задачи твоей команды, но принцип тот же Добавлено через 1 минуту и 53 секунды Отпиши получилось или нет -------------------- Глуп тот кто полагается на истину авторитета, а не на авторитет истины [color=red]KAV&KIS==Evil[/color] |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Ну логика решения проблемы понятна, но всё же мне очень важно узнать почему функция вызывается дважды мгновенно(притом ещё и вылетаю в исключение). Это ж ведь ненормально.
А весь код и не нужен, он на самом деле громоздкий, а сама суть здесь изложена в этом коде, здесь такая же ситуация получается. Могу весь код выложить этой ситуации, дабы можно было его скопировать и проверить у себя.
--------------------
Бери от жизни всё. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
А чем компонент TTimer не угодил?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Palladin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 932 Регистрация: 15.5.2007 Где: Беларусь г.Гомель Репутация: 3 Всего: 17 |
Хм, ну почему эт конечно хороший вопрос, ответа на него у мя нет, может быть функция settimer юзает какието функции Windows а в XP они несколько отличны от одноименной в 98 и др.
вообщем ответа у меня нет, решение есть и я его тееб отписал Добавлено через 1 минуту и 40 секунд Да-да Алексей прав, юзай таймер в конце enabled в false да и все, но впринципе это лиш альтернатива моего метода, хотя скорее наоборот -------------------- Глуп тот кто полагается на истину авторитета, а не на авторитет истины [color=red]KAV&KIS==Evil[/color] |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Конечно все калбэк функции по дефлоту должны быть stdcall. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lexicss |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Дело в том что программу писал не я, я дорабатываю, следует оставлять всё так как было задумано разработчиком. Притом в 98-ой всегда всё было нормально, а как перешли на 2000-ую вот такая хрень вылезла.
Вот этого кстати не знал. А почему? Совет, впринципе правильный, но тогда напрашивается вопрос почему в 98-ой всё работает нормально без stdcall. Я вот слышал об этом соглашении что его обычно применяют в описаниях API-функций. Я, наверное, задаю слишком много вопросов. Просто моей задачей стоит не решить конкретную ситуацию і забыть о ней, а именно разобраться почему так получается. Возможно, разобравшись в этом я(да и не тока я) смогу решить и другие проблемы, где есть такое же, но жучки ещё не дали о себе знать. Но всё равно спасибо за советы. Если кто-то что-то ещё знает об этом, пишите. Поделюсь ещё своими наблюдениями. Если изменить код, подавать в MyFunc не 4, а 3(например) параметра, то тогда всё нормально, работает без всяких повторных вызовов и исключений, и stdcall не нужен. Разбирая эти две ситуации в ассемблерном коде обнаружил - (в 4-х параметровой Это сообщение отредактировал(а) Lexicss - 26.5.2007, 01:48 --------------------
Бери от жизни всё. |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
а зачем извраты такие?
все системные callback-функции, как уже говорилось, должны быть с директивой stdcall. наверняка это просто случайность. выскажу свои аргументы... вот выдержки из хелпа:
из чего делаем следующие выводы: по умолчанию в делфи используется способ передачи до трех параметров через регистры процессора (директива register). параметры передаются слева направо. в системе по умолчанию используется способ передачи, при котором параметры передаются через стэк, порядок параметров справа налево. соотв. при обозначении в твоей функции трех параметров и без указания stdcall. внутрь попадает абсолютно ничего не значащие значения регистров. а если указано 4 параметра, то последний извлекается из стэка... чем его видимо и рушит... Это сообщение отредактировал(а) MetalFan - 26.5.2007, 09:18 -------------------- There are always someone smarter than you... |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
MetalFan, спасибо.
Вопрос почти решён. Остатётся только непонятка, почему работает в 98-ой без stdcall??? Притом программа работает уже давно(более 5 лет). --------------------
Бери от жизни всё. |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
||||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Как я понял из вышеизложенных постов: Моя процедура MyFunc является callback API-шной и следовательно нуждается в директиве stdcall. Если я понял что-то не так - поправьте, пожалуйста.
Но всё же остаётся открытым вопрос, почему в Windows 98 эта функция работатет нормально без stdcall, хоть в ней и больше 3-х параметров? Может ещё какие будут варианты объяснения кроме случайности? Если кто что толкового подскажет, буду признателен. ;) --------------------
Бери от жизни всё. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |