C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Waitable Timer, "Неправильно" себя ведет
Jojobets
Отправлено: 25.07.2005, 15:50


Ученик-кочегар

Группа: Участник
Сообщений: 16



Прилагаемый код по-разному работает на разных машинах. Во вкладыше два снимка: pc1.png отражает работу на первой системе (WinXp Pro SP1), pc2.png-на второй (WinXp Pro SP2). Как видим, на первой системе программа работает так, как ожидалось — время первого срабатывания и интервал срабатывания именно такие, какие устанавливались. Однако на второй системе программа работает иначе — сработала невовремя и интервал срабатывания с каждым "тиком" увеличивается!
Если кто сталкивался с такой проблемой, давайте обсудим. wink.gif

User Attached Image Скачать файл
sampletimer.zip


timson
Отправлено: 25.07.2005, 17:00


Станционный диспетчер

Группа: Участник
Сообщений: 82



CODE
 FILETIME ft;
...
SetWaitableTimer(myform->hSecondsTimer, (LARGE_INTEGER*)&ft, 5000UL, NULL, NULL, FALSE);
(LARGE_INTEGER*)&ft -!!!!!!!!!!

так некоректно, т.к. если даже размеры полей структур совпадают, но выравнивание границ может быть разное — sizeof(FILETIME) != sizeof(LARGE_INTEGER)
так коректнее:
CODE
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;

Еще вроде надо время указывать абсолютное (по гринвичу) — LocalFileTimeToFileTime()


Отредактировано timson — 25/07/2005, 17:02
Jojobets
Отправлено: 25.07.2005, 18:06


Ученик-кочегар

Группа: Участник
Сообщений: 16




sizeof(FILETIME) = sizeof(LARGE_INTEGER) = 8 байт.
Выравнивание данных можно осуществлять по границам байтов, установив соответствующие опции компилятора (Рихтер, привет ...).
Но дело даже не в этом. Никак не могу понять, почему возрастает интервал срабатывания ожидаемого таймера (внимательно см. pc2.png во вкладыше первого сообщения). sad.gif
timson
Отправлено: 26.07.2005, 08:47


Станционный диспетчер

Группа: Участник
Сообщений: 82



а если перекомпилить на второй системе???
Jojobets
Отправлено: 26.07.2005, 10:33


Ученик-кочегар

Группа: Участник
Сообщений: 16



Ничего не дает перекомпиляция программы на других системах.
timson
Отправлено: 26.07.2005, 10:44


Станционный диспетчер

Группа: Участник
Сообщений: 82



а если попробывать время задать отрицательным?? — есть же такая возможность (в хелпе подробно расписано)
Jojobets
Отправлено: 26.07.2005, 17:03


Ученик-кочегар

Группа: Участник
Сообщений: 16



В справке указано, что положительное время-абсолютное, отрицательное — относительное. Т.е. первый старт происходит через указанное количество времени после вызова SetWaitableTimer.
Подставлять отрицательное время не пробовал, стоит иная задача (больше нравится устанавливать абсолютное время:) ).
Пытаюсь выяснить, не внесли ли здесь свой "вклад" обновления винды, которые я недавно установил smile.gif
timson
Отправлено: 27.07.2005, 06:58


Станционный диспетчер

Группа: Участник
Сообщений: 82



кстати, у меня на WinXP Pro (en) SP2 нормально работает, каждые 5сек 7мс отчет пишет.

Вернуться в Вопросы программирования в C++Builder