Una actualización de funciones de RAD Studio 10.4.2, impulsada por un análisis que muestra un aumento en el número de desarrolladores que utilizan el escritorio remoto para el desarrollo durante Covid, ha sido una aceleración del renderizado IDE sobre Escritorio remoto.
Los principales problemas en los que se centraron fueron el bloqueo del IDE en algunas situaciones (como al conectar o desconectar el escritorio remoto), el parpadeo y algunos AV.
Los elementos de QP analizados para 10.4.2 incluyen:
- Vuelva a conectar una sesión RDP existente usando la misma configuración de pantalla (misma máquina) RS-99048
- Vuelva a conectar una sesión RDP existente usando diferentes configuraciones de pantalla (por ejemplo, desde una máquina diferente) RS-103339
- Vuelva a conectar una sesión RDP existente con el diseñador FMX abierto causa AV.
Además, hubo una serie de informes internos.
Si bien no tengo un proyecto de muestra que se pueda compartir, tengo permiso para compartir algunas notas que el equipo de I + D de Embarcadero proporcionó en función de sus experiencias, y espero que esto también sea útil para otros desarrolladores.
La causa principal de todos esos problemas es que cualquier cambio de sesión de RDP (bloquear, desbloquear, conectar, desconectar) envió un cambio de configuración de todo el sistema (WM_SETTINGCHANGE) que provocó una cascada de mensajes que conduce a múltiples redibujos en el IDE. Esta fue la causa de algunos de los AV, ya que entre los mensajes en cascada enviados por el sistema operativo incluía el mensaje WM_THEMECHANGED que estaba activando la recreación del controlador para algunos controles. Esto estaba afectando a los diseñadores de VCL / FMX cuando se dejaron abiertos y se reconectó una sesión mediante RDP.
La API de WTS proporciona una forma de recibir las notificaciones de cambio de sesión de RDP (WM_WTSSESSION_CHANGE). La gestión de esto permite que el IDE sea notificado cuando la sesión está bloqueada, desbloqueada, conectada, desconectada, y desde aquí podemos elegir cómo se maneja WM_SETTINGCHANGE y evitar los problemas de parpadeo / repintado.
Una nota del equipo de I + D fue que el uso de estilos VCL en servicios de terminal es más probable que haga que una aplicación parpadee en circunstancias normales.
Se espera que esta muestra de código esqueleto (no probado) proporcione indicaciones en la dirección correcta para cualquiera que busque agregar un soporte similar en sus aplicaciones.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
type TFormMain = class(TForm) TimerEnableMetricSettings : TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure TimerEnableMetricSettingsOnTimer(Sender: TObject); private FMethodWnd: HWND; procedure WTS_SessionWndProc(var Message: TMessage); procedure DoHandleRDPLock; procedure DoHandleRDPUnLock; end; var FormMain: TFormMain; implementation {$R *.dfm} procedure TFormMain.DoHandleRDPLock; begin // Prevent the VCL App reacting to WM_SETTINGCHANGE when a rdp session is locked/disconnected. // Stop the timer if it's already running if TimerEnableMetricSettings.Enabled then TimerEnableMetricSettings.Enabled := False; Application.UpdateMetricSettings := False; end; procedure TFormMain.DoHandleRDPUnLock; begin // Stop the timer if it's already running if TimerEnableMetricSettings.Enabled then TimerEnableMetricSettings.Enabled := False; // Re-start the timer. TimerEnableMetricSettings.Enabled := True; end; procedure TFormMain.FormCreate(Sender: TObject); begin TimerEnableMetricSettings.Interval := 30000; TimerEnableMetricSettings.Enabled := False; // This hooks to the method WTS_SessionWndProc below to control the Lock FMethodWnd := AllocateHWnd(WTS_SessionWndProc); WTSRegisterSessionNotification(FMethodWnd, NOTIFY_FOR_THIS_SESSION); end; procedure TFormMain.FormDestroy(Sender: TObject); begin if FMethodWnd <> 0 then begin WTSUnRegisterSessionNotification(FMethodWnd); DeallocateHWnd(FMethodWnd); end; end; procedure TFormMain.WTS_SessionWndProc(var Message: TMessage); begin if Message.Msg = WM_WTSSESSION_CHANGE then begin case Message.wParam of WTS_SESSION_LOCK, WTS_REMOTE_DISCONNECT: DoHandleRDPLock; WTS_REMOTE_CONNECT, WTS_SESSION_UNLOCK: DoHandleRDPUnLock; end; end; Message.Result := DefWindowProc(FMethodWnd, Message.Msg, Message.WParam, Message.LParam); end; procedure TFormMain.TimerEnableMetricSettingsOnTimer(Sender : TObject); begin // stop the timer TimerEnableMetricSettings.Enabled := False; // it is recommended to wait a few seconds before this is run // hence setting the timer interval to 30000 in FormCreate Application.UpdateMetricSettings := True; end; end. |
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition