web-dev-qa-db-ja.com

タブレットデバイスを追加または削除した後、WPFアプリケーションがタッチに応答しなくなる

現在CPU使用率が高いコンピューターで任意のWPFアプリケーションを実行します。同時にUSB HIDタブレットデバイスの接続と取り外しを続けると、WPFアプリケーションはタッチに対する応答を停止し、マウスに対してのみ応答します。

要求事項:

  1. 任意のWPFアプリケーションを実行します
  2. USB HIDタブレットデバイスの接続と取り外しを続ける
  3. CPU使用率を高くする

私の質問:

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.
35
walterlv

ハードウェアデバイスが繰り返し接続と切断を繰り返すと、オペレーティングシステムは最終的にクラッシュし、リソースの使用が原因で停止するか、メモリが破損します。

ユーザーがタブレットを接続し、WPFデスクトップアプリケーションのボタンをクリックして[タブレットを有効にする]サポートを有効にするまで、WPFデスクトップアプリケーションを何もしないように変更することをお勧めします。

そうしないと、不良のUSBケーブルを使用しているユーザーがタブレットの接続と取り外しを繰り返し行うことになります。

OSは、障害のあるディスクコントローラーである場合と同じようにデバイスを処理できません。

1
JohnT