Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
10th
Ноя
Менеджер таймеров
Posted by bullvinkle under Пост-обзор, Топик-обзор
Ситуация:
Для двига делаю возможность созания таймера средствами самого двига.
Function CreateTimer(Freq : Integer; Proc : TSimplyProcedure) : Integer;
TSimplyProcedure — это процедура без параметров.
Так вот, как особо продвинутые из Вас знают, способов создания таймера два:
1) Через получение формой сообщения WM_TIMER.
2) Через callback функцию.
Первый способ мне не подходит по одной простой причине:
Заметим, что сообщение WM_TIMER является низкоприоритетным. Это означает, что функция DispatchMessage посылает это сообщение приложению только в том случае, если в очереди приложения нет других сообщений. В этом отличие таймера Windows от аналогичных средств MS-DOS, реализованных с помощью перехвата прерывания INT 8h. |
Если я (пользователь) буду банально вертеть мышью — до таймера дело так и не дойдет.
А вот со вторым заковырка.
Function CreateTimer(Freq : Integer; Proc : TSimplyProcedure) : Integer;
Пользователь дает мне просто процедуру без параметров. Запихнуть её на место каллбачной в SetTimer просто так нельзя — несоответствие типов и памяти. Хотя такой вариант тоже в принципе (теоретически, через большой геморрой) тоже можно организовать.
Обсудив этот вопрос по аське со Stilet`ом пришли к выводу, что наиболее простым и работающим вариантом будет создание потока и передача ему в параметрах процедуры, переданной пользователем, а всамо потоке создать callback, в котором вызывать пользовательскую…
НО!
Сейчас dll двигла весит 42 кб в непожатом и 21 в пожатом состояниях. Номально и даже превосходно для двигла для создания окон на WinAPI. А вот при подключении Classes для созания потоков размер уходит в 200 кб, что не приемлемо для проекта такого рода.
Что предложите, господа присяжные заседатели?
——————————————————————————————————————————————————————-
ну я вижу два выхода:
1)потоки на АПИ.
2)сделать список/массив соответствия ID->обработчик
ListEntry=record
ID:integer;
Proc:TSimplyProcedure;
end;
//список сам организуешь:)
далее делаем так
procedure TimerHandler(H:THandle;uMsg:UINT;ID:UINT;Time:DWORD);stdcall;
begin
TimerList[ID].Proc();//вроде так можно, но в общем намек понял, что нужно с нашего списка по идентификатору получить процедуру.
end;
Function CreateTimer(Freq : Integer; Proc : TSimplyProcedure) : Integer;
begin
Result:=TimerList.Add(SetTimer(0,0,Frec,TimerHandler),Proc);
end;
Procedure DestroyTimer(ID:Integer);
begin
KillTimer(TimerList[ID].ID);
TimerList.Delete(ID);
end;
примерно так, хотя есть проблемка синхронизации…по крайней мере может возникнуть, хотя, таймер все равно выполняется в главном потоке(тот поток что имеет цикл сообщений, он и создает обычно таймер)
кстати смотри, что работе этому таймеру в любом случае нужен цикл основной(сообщений).
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)