0

私は、この問題に関係のない多くのことを行う小さなディスプレイユニットとインターフェースしているC#でプログラムを書いています。

私が抱えている問題の詳細は次のとおりです。ユーザーがいくつかの設定をデバイスに保存しようとするボタンを選択すると、設定が完了したことを確認するために確認プロトコルが使用されます (つまり、設定を送信してから確認を待ちます)。デバイスからのパケット。)

私がしていることは、デバイスに保存しようとする生成しようとしているスレッドの「親」スレッドになるメインアプリケーションでスレッドを生成することです。現在、次の方法で動作します。

  • スレッド 1 の生成 -> 保存を試みます。

  • タイムアウトした場合は、Thread.Interrupt() 経由でスレッド 1 に割り込みます (デバイスのデータ ロックを解除します) <----- これが問題です . これはうまくいきません。デバイスがオフになるかプラグが抜かれるまでロックを太字にし、その後エラーになります。(その後、新しいスレッドが生成されますが、これは現在発生していますが、最初のスレッドがまだデータをロックアウトしているため、機能しません)。

  • タイムアウトしなかった場合、スレッド 1 のコールバックにより、親スレッドはこれ以上スレッドを生成しないことを認識できます。

  • 最後に、どのスレッドも成功しなかった場合、全体の試行は失敗しました。

また、単一のスレッドが生成されてシャットダウンされた状態でこれを実行しようとしましたが、デバイスからの確認応答を待機しているときに、デバイスの電源がオフになるかプラグが抜かれるまで永久にハングするという同じ動作を示します。

デバイスが待機中の呼び出しを終了しないため、スレッドを停止するように設定できるブール値を持つ ack を送信するのを待つことをカプセル化する方法はありません。これは組み込みソフトウェアなので、待機関数を変更することはできません。組み込みソフトウェアへの C# インターフェイスのみを変更できます。

4

2 に答える 2

2

あなたはあなたのスレッド1がACKを永遠に待つと言っているようです。そして、別のスレッドがタイムアウト条件を検出し、スレッド1を中断しようとします。スレッド1は永久に待機するのではなく、ACKの待機中にタイムアウトする必要があることをお勧めします。その後、スレッド1は再試行するか、エラーで終了することができ、別のスレッドからの割り込みは必要ありません。

于 2012-06-15T18:37:08.570 に答える
0

割り込みの代わりにThread.Abortを使用する必要があります。さらに明確にするために、このスレッドを見てください Abort Vs Interrupt

これで問題が解決するはずです。

于 2012-06-15T17:59:21.753 に答える