Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
BeiträgeDelphi

So beschleunigen Sie Remotedesktopanwendungen

remote desktop faster

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.

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.
RAD Studio 13.1 Florence Now Available See What's New in RAD Studio 13.1 Delphi is 31 - Webinar Replay

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES