Uma atualização de recurso para RAD Studio 10.4.2, conduzida por análise que mostra um aumento no número de desenvolvedores usando desktop remoto para desenvolvimento durante a Covid, foi a velocidade de renderização IDE sobre Desktop Remoto.
Os principais problemas focados foram o congelamento do IDE em algumas situações (como ao conectar ou desconectar a área de trabalho remota), oscilação e alguns AVs.
Os itens QP analisados para 10.4.2 incluem:
- Reconecte uma sessão RDP existente usando as mesmas configurações de tela (mesma máquina) RS-99048
- Reconecte uma sessão RDP existente usando configurações de tela diferentes (por exemplo, de uma máquina diferente) RS-103339
- Reconectar uma sessão RDP existente com o designer FMX aberto causa AV.
Além disso, havia vários relatórios internos.
Embora eu não tenha um projeto de amostra que possa ser compartilhado, tenho permissão para compartilhar algumas notas que a equipe de P&D da Embarcadero forneceu com base em suas experiências e espero que isso seja útil para outros desenvolvedores também.
A causa raiz de todos esses problemas é que qualquer alteração de sessão RDP (bloquear, desbloquear, conectar, desconectar) enviou uma alteração de configuração de todo o sistema (WM_SETTINGCHANGE) causando uma cascata de mensagens que leva a vários redesenhos no IDE. Esta foi a causa de alguns dos AVs, pois entre as mensagens em cascata enviadas pelo SO incluía a mensagem WM_THEMECHANGED que estava acionando a recriação do identificador para alguns controles. Isso estava afetando os designers VCL / FMX quando eles foram deixados abertos e uma sessão foi reconectada via RDP.
A API WTS fornece uma maneira de receber as notificações de alteração de sessão RDP (WM_WTSSESSION_CHANGE). Gerenciar isso permite que o IDE seja notificado quando a sessão for bloqueada, desbloqueada, conectada, desconectada e, a partir daqui, podemos escolher como o WM_SETTINGCHANGE é tratado e evitar os problemas de oscilação / repintura.
Uma observação da equipe de P&D foi que o uso de estilos VCL em serviços de terminal é mais provável de fazer um aplicativo piscar em circunstâncias normais.
Este exemplo de esqueleto de código (não testado) deve fornecer indicadores na direção certa para qualquer pessoa que queira adicionar suporte semelhante a seus aplicativos.
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