Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++DelphiIDERAD Studio

リモートデスクトップアプリケーションを高速化する方法

remote desktop faster

最近はテレワークの普及によって、VPN経由で企業ネットワークへリモート接続する需要が増えており、それに伴って開発者がリモートデスクトップを頻繁に利用する機会も増加しているという統計があります。

RAD Studio 10.4.2では、リモートデスクトップ経由でRAD Studioを利用する際に顕在化されたいくつかの問題点が改善されており、さらに従来のバージョンと比較してリモートデスクトップ上でのIDEレンダリングが高速化されています。

主な問題点としては、特定の状況(リモートデスクトップの接続または切断時など)でのIDEのフリーズ、ちらつき、およびいくつかのアクセス違反が発生するなどの問題がありました。

以下は、10.4.2で修正されたQuality Portal並びに内部のバグ報告のリストの一部です。

  • Reconnect an Existing RDP session using the same screen settings (same machine) RS-99048
  • Reconnect an Existing RDP session using different screen settings (e.g from a different machine) RS-103339 (RSP-31206)
  • Reconnect an Existing RDP session with the FMX designer opened causes AV.

上記に加えて、多くの内部のバグ報告がありました。

ここでは、共有可能なサンプルプロジェクトはありませんが、エンバカデロの開発部が経験に基づいて調査を行ったいくつかの情報を共有する許可を得ており、開発部からの情報がRAD Studioを利用する開発者にも役立つことを願っています。

すべての問題となる根本的な原因は、RDPセッションの変更(ロック、ロック解除、接続、切断)がシステム全体の設定変更(WM_SETTINGCHANGE)を送信し、IDEで複数の再描画につながるメッセージのカスケードを引き起こしたことにあります。

これは、Windows OSによって送信されたカスケードメッセージの間に、一部のコントロールのハンドルの再作成をトリガーとするWM_THEMECHANGEDメッセージが含まれていたため、いくつかのアクセス違反が生じる原因となっていました。これによってRAD StudioのVCL/FMXのデザイナが開いたままの状態になっていて、セッションがRDP経由で再接続されたときに影響を与えていました。

WTS APIは、RDPセッション変更通知 (WM_WTSSESSION_CHANGE)を受信する方法を提供します。これを管理することで、セッションがロック、ロック解除、接続、切断されたときにIDEに通知を受け取ることができ、ここからWM_SETTINGCHANGEをどのように処理するか判断ができるので、ちらつき/再描画の問題を回避することができます。

開発部からのコメントによると、ターミナルサービスでVCLスタイルを使用すると、通常の状況でアプリケーションにちらつきが発生する可能性が高くなるということでした。

以下のコード例は、スケルトンサンプル(十分なテストしていない)ではありますが、アプリケーションに対して同様な目的を追加しようとしている開発者に、このコードが正しい方向へ導くヒントになれば、幸いです。

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.

今すぐ10.4.2を使い始めよう

すでに、10.4.2のトライアル版が利用可能になっており、今後製品を購入いただくと、10.4.2をダウンロードいただけるようになります。また、すでに製品をお持ちの方は、有効なアップデートサブスクリプションがあれば、既存のライセンスを使用してRAD Studio 10.4.2をご利用いただけます。10.4.2のダウンロードは、新しいカスタマーポータルサイト(my.embarcadero.com)から行えます。

詳細については、以下の情報をご確認ください。

エンバカデロでは、10.4.2において行った作業について大きな成果を上げることができたと考えており、皆さんがこの新しいリリースをご活用いただけるものと期待しています。

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