現在CPU使用率が高いコンピューターで任意のWPFアプリケーションを実行します。同時にUSB HIDタブレットデバイスの接続と取り外しを続けると、WPFアプリケーションはタッチに対する応答を停止し、マウスに対してのみ応答します。
要求事項:
私の質問:
Microsoft以外の開発者がこのタッチエラーを修正するための完全な方法はありますか?
ここにタッチ障害の予備分析を掲載しました:
この記事はStackOverflowにとって少し長いので、ここではいくつかの結論についてのみ触れます。
GetPenEventMultiple
にデッドロックが発生している可能性があります。GetTabletInfoHelper
には他にもスレッドセーフの問題がある可能性があります。以下のコードは.NET Frameworkからのものであり、理解を容易にするためにそれらを簡略化しました。
// PenThreadWorker.ThreadProc
while(There are two loops in real)
{
// The `break` below only exit one loop, not two.
if (this._handles.Length == 1)
{
if (!GetPenEvent(this._handles[0], otherArgs))
{
break;
}
}
else if (!GetPenEventMultiple(this._handles, otherArgs))
{
break;
}
// Other logics.
}
// WorkerOperationGetTabletsInfo.OnDoWork
try
{
_tabletDeviceInfo = PenThreadWorker.GetTabletInfoHelper(pimcTablet);
}
catch(COMException)
{
_tabletDevicesInfo = new TabletDeviceInfo[0];
}
catch(ArgumentException)
{
_tabletDevicesInfo = new TabletDeviceInfo[0];
}
// Other exception handling.
ハードウェアデバイスが繰り返し接続と切断を繰り返すと、オペレーティングシステムは最終的にクラッシュし、リソースの使用が原因で停止するか、メモリが破損します。
ユーザーがタブレットを接続し、WPFデスクトップアプリケーションのボタンをクリックして[タブレットを有効にする]サポートを有効にするまで、WPFデスクトップアプリケーションを何もしないように変更することをお勧めします。
そうしないと、不良のUSBケーブルを使用しているユーザーがタブレットの接続と取り外しを繰り返し行うことになります。
OSは、障害のあるディスクコントローラーである場合と同じようにデバイスを処理できません。