SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » Как поставить процедуру в очередь обработки сообщений
Как поставить процедуру в очередь обработки сообщений [сообщение #1715] Thu, 02 March 2023 02:44 Переход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 188
Зарегистрирован: September 2022
Senior Member
Я вот какое-то время занимался кутежом и развратом с Qt и WxWidgets (C++) и там нахватался разных глупостей.
И после этого захотелось в Delphi возможности отложенного запуска процедуры после завершения текущего обработчика сообщений.
Есть же готовые процедуры, которые и так запускаются "потом". Например, Application.Terminate(). Но хочется чтобы свою и чтобы как-то универсально, для процедур с разным набором параметров. Возможно, в новомодных дельфях подобное уже возможно, с помощью дженериков и/или лямбд, но у меня дельфи старые (D2007).
Т.е., можно сделать обработчик специального сообщения окна, запаковывать параметры куда-то в кучу, а ссылку помешать в параметры сообщения. Или параметры - в глобальную область, а обработку запускать, стартуя специальный таймер с минимальным интервалом, в коде обработчика этого таймера будет вызов нужной процедуры. Но все как-то криво и одноразово.
Можно создать универсальный обработчик специального сообщения, а процедуру писать с параметром array of const... на большее фантазии не хватает.
А хочется передать и адрес процедуры, и адрес блока параметров, и чтобы компилятор контролировал типы при вызове.

?
Re: Как поставить процедуру в очередь обработки сообщений [сообщение #1735 является ответом на сообщение #1715] Fri, 03 March 2023 10:21 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 282
Зарегистрирован: June 2022
Senior Member
Встроенного ничего нет. Только самому городить.

Вообще 20007 уже 16 лет. Не пора ли закопать стюардессу?
Re: Как поставить процедуру в очередь обработки сообщений [сообщение #1737 является ответом на сообщение #1715] Fri, 03 March 2023 12:44 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
Посмотри в сторону TThread.Queue(), если оно имело место в D2007.

[Обновления: Fri, 03 March 2023 12:52]

Известить модератора

Re: Как поставить процедуру в очередь обработки сообщений [сообщение #1742 является ответом на сообщение #1735] Sat, 04 March 2023 02:28 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 188
Зарегистрирован: September 2022
Senior Member
BlackEric писал(а) Fri, 03 March 2023 10:21
Встроенного ничего нет. Только самому городить.

Вообще 20007 уже 16 лет. Не пора ли закопать стюардессу?
Ну вот что есть.

VladF писал(а) Fri, 03 March 2023 12:44
Посмотри в сторону TThread.Queue(), если оно имело место в D2007.
Спасибо. Эта штука в D2006 появилась, и не умеет с произвольными (с разным набором параметров) процедурами, да и не то.
Re: Как поставить процедуру в очередь обработки сообщений [сообщение #2050 является ответом на сообщение #1742] Tue, 11 April 2023 18:09 Переход к предыдущему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 188
Зарегистрирован: September 2022
Senior Member
В Лазарусе у класса TApplication есть метод QueueAsincCall: https://lazarus-ccr.sourceforge.io/docs/lcl/forms/tapplicati on.queueasynccall.html
Там сие сделано "кроссплатформенно", но тоже одноразово. В куче создаётся структура: указатель на метод объекта (фактически пара указателей @код + @данные экземпляра объекта) и обезличенный (Pointer) указатель на параметры. И помещается в потокобезопасную очередь, потом объект Application разгребает ее, вызывая методы с параметром.
...
В Delphi, чисто под Windows, сие реализуется ещё проще: указатель на структуру помещается в очередь сообщений какого-нибудь окна, вот и всё, десяток строчек кода. Только для старых версий Delphi, где нет обобщенных структур, придется громоздить свой вариант реализации для каждого типа отложенно-вызываемых процедур. Ну, ещё несколько строчек.
Предыдущая тема: LMD 2016.5 под Delphi 11.3
Следующая тема: Сохранение открытого документа OpenOffice
Переход к форуму:
  


Текущее время: Thu Mar 28 15:44:17 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00789 секунд