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