私の C# アプリケーションでは、バックグラウンド ワーカーを使用して、送信されたデータの確認応答を待機しています。これは、私がやろうとしていることを示す疑似コードです。
UI_thread
{
TransmitData()
{
// load data for tx
// fire off TX background worker
}
RxSerialData()
{
// if received data is ack, set ack received flag
}
}
TX_thread
{
// transmit data
// set ack wait timeout
// fire off ACK background worker
// wait for ACK background worker to complete
// evaluate status of ACK background worker as completed, failed, etc.
}
ACK_thread
{
// wait for ack received flag to be set
}
何が起こるかというと、ACK BackgroundWorker がタイムアウトになり、確認がまったく受信されません。そのデバイスはまったく変更されておらず、C# アプリケーションが送信しているため、リモート デバイスによって送信されていることはほぼ確実です。私はこれからackスレッドを変更しました(それが機能していたとき)...
for( i = 0; (i < waitTimeoutVar) && (!bAckRxd); i++ )
{
System.Threading.Thread.Sleep(1);
}
...これに...
DateTime dtThen = DateTime.Now();
DateTime dtNow;
TimeSpan stTime;
do
{
dtNow = DateTime.Now();
stTime = dtNow - dtThen;
}
while ( (stTime.TotalMilliseconds < waitTimeoutVar) && (!bAckRxd) );
後者は、前者と比較して、非常に正確な待ち時間を生成します。ただし、スリープ機能を削除したことで、シリアル データの受信に支障が出ているのではないかと考えています。C# では一度に 1 つのスレッドしか実行できませんか? つまり、他のスレッドを実行できるようにするために、ある時点でスレッドをスリープ状態にする必要がありますか?
ご意見やご提案をいただければ幸いです。Microsoft Visual C# 2008 Express Edition を使用しています。ありがとう。