Ein Feature-Update für RAD Studio 10.4.2, das auf einer Analyse basiert, die zeigt, dass die Anzahl der Entwickler, die Remotedesktop für die Entwicklung während Covid verwenden, gestiegen ist, war eine Beschleunigung des IDE-Renderings über Remotedesktop.
Die Hauptprobleme waren das Einfrieren der IDE in bestimmten Situationen (z. B. beim Verbinden oder Trennen des Remotedesktops), das Flackern und einige AV-Geräte.
Die für 10.4.2 betrachteten QP-Elemente umfassen:
- Verbinden Sie eine vorhandene RDP-Sitzung erneut mit denselben Bildschirmeinstellungen (demselben Computer) RS-99048
- Verbinden Sie eine vorhandene RDP-Sitzung erneut mit verschiedenen Bildschirmeinstellungen (z. B. von einem anderen Computer) RS-103339
- Das erneute Verbinden einer vorhandenen RDP-Sitzung mit geöffnetem FMX-Designer führt zu AV.
Darüber hinaus gab es eine Reihe interner Berichte.
Ich habe zwar kein Beispielprojekt, das geteilt werden kann, aber ich habe die Erlaubnis, einige Notizen zu teilen, die das Forschungs- und Entwicklungsteam von Embarcadero aufgrund ihrer Erfahrungen zur Verfügung gestellt hat, und ich hoffe, dass dies auch anderen Entwicklern nützlich sein wird.
Die Hauptursache für all diese Probleme ist, dass jede Änderung der RDP-Sitzung (Sperren, Entsperren, Verbinden, Trennen) eine systemweite Einstellungsänderung (WM_SETTINGCHANGE) gesendet hat, die eine Nachrichtenkaskade verursacht, die zu mehreren Neuzeichnungen in der IDE führt. Dies war die Ursache für einige AVs, da zwischen den vom Betriebssystem gesendeten Kaskadennachrichten die Nachricht WM_THEMECHANGED enthalten war, die bei einigen Steuerelementen die Neuerstellung des Handles auslöste. Dies wirkte sich auf die VCL / FMX-Designer aus, als sie offen gelassen wurden und eine Sitzung über RDP erneut verbunden wurde.
Die WTS-API bietet eine Möglichkeit, Benachrichtigungen über RDP-Sitzungsänderungen (WM_WTSSESSION_CHANGE) zu erhalten. Wenn Sie dies verwalten, wird die IDE benachrichtigt, wenn die Sitzung gesperrt, entsperrt, verbunden oder getrennt wird. Von hier aus können Sie auswählen, wie mit WM_SETTINGCHANGE umgegangen werden soll, und Probleme mit dem Flackern / Neulackieren vermeiden.
Ein Hinweis des Forschungs- und Entwicklungsteams war, dass die Verwendung von VCL-Stilen für Terminaldienste unter normalen Umständen eher dazu führt, dass eine Anwendung flackert.
Dieses Skelett-Codebeispiel (ungetestet) sollte hoffentlich Hinweise in die richtige Richtung für alle liefern, die ihren Anwendungen ähnliche Unterstützung hinzufügen möchten.
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