最近はテレワークの普及によって、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スタイルを使用すると、通常の状況でアプリケーションにちらつきが発生する可能性が高くなるということでした。
以下のコード例は、スケルトンサンプル(十分なテストしていない)ではありますが、アプリケーションに対して同様な目的を追加しようとしている開発者に、このコードが正しい方向へ導くヒントになれば、幸いです。
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. |
今すぐ10.4.2を使い始めよう
すでに、10.4.2のトライアル版が利用可能になっており、今後製品を購入いただくと、10.4.2をダウンロードいただけるようになります。また、すでに製品をお持ちの方は、有効なアップデートサブスクリプションがあれば、既存のライセンスを使用してRAD Studio 10.4.2をご利用いただけます。10.4.2のダウンロードは、新しいカスタマーポータルサイト(my.embarcadero.com)から行えます。
詳細については、以下の情報をご確認ください。
- RAD Studio 10.4.2 Sydney Release 2の提供開始を発表
- 10.4.2の新機能
- DocWikiの10.4.2新機能ページ
- RAD Studio 10.4.2 における新機能と修正された顧客から報告された問題
エンバカデロでは、10.4.2において行った作業について大きな成果を上げることができたと考えており、皆さんがこの新しいリリースをご活用いただけるものと期待しています。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition