Начало » Программирование » Delphi » Как поставить процедуру в очередь обработки сообщений
Как поставить процедуру в очередь обработки сообщений [сообщение #1715] |
Thu, 02 March 2023 02:44 |
Сообщений: 198 Зарегистрирован: September 2022
|
Senior Member |
|
|
Я вот какое-то время занимался кутежом и развратом с Qt и WxWidgets (C++) и там нахватался разных глупостей.
И после этого захотелось в Delphi возможности отложенного запуска процедуры после завершения текущего обработчика сообщений.
Есть же готовые процедуры, которые и так запускаются "потом". Например, Application.Terminate(). Но хочется чтобы свою и чтобы как-то универсально, для процедур с разным набором параметров. Возможно, в новомодных дельфях подобное уже возможно, с помощью дженериков и/или лямбд, но у меня дельфи старые (D2007).
Т.е., можно сделать обработчик специального сообщения окна, запаковывать параметры куда-то в кучу, а ссылку помешать в параметры сообщения. Или параметры - в глобальную область, а обработку запускать, стартуя специальный таймер с минимальным интервалом, в коде обработчика этого таймера будет вызов нужной процедуры. Но все как-то криво и одноразово.
Можно создать универсальный обработчик специального сообщения, а процедуру писать с параметром array of const... на большее фантазии не хватает.
А хочется передать и адрес процедуры, и адрес блока параметров, и чтобы компилятор контролировал типы при вызове.
?
|
|
|
|
|
|
Re: Как поставить процедуру в очередь обработки сообщений [сообщение #2050 является ответом на сообщение #1742] |
Tue, 11 April 2023 18:09 |
Сообщений: 198 Зарегистрирован: September 2022
|
Senior Member |
|
|
В Лазарусе у класса TApplication есть метод QueueAsincCall: https://lazarus-ccr.sourceforge.io/docs/lcl/forms/tapplicati on.queueasynccall.html
Там сие сделано "кроссплатформенно", но тоже одноразово. В куче создаётся структура: указатель на метод объекта (фактически пара указателей @код + @данные экземпляра объекта) и обезличенный (Pointer) указатель на параметры. И помещается в потокобезопасную очередь, потом объект Application разгребает ее, вызывая методы с параметром.
...
В Delphi, чисто под Windows, сие реализуется ещё проще: указатель на структуру помещается в очередь сообщений какого-нибудь окна, вот и всё, десяток строчек кода. Только для старых версий Delphi, где нет обобщенных структур, придется громоздить свой вариант реализации для каждого типа отложенно-вызываемых процедур. Ну, ещё несколько строчек.
|
|
|
Переход к форуму:
Текущее время: Wed Dec 18 14:56:56 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01064 секунд
|