オーバーラップ I/O を使用するかどうかは、実際には問題ではありません。オーバーラップは、プログラムの時間を解放するだけです。私はこのようなプログラムをたくさん書いてきましたが、結論は常にスレッドを使用してすべての COM ルーチンを処理することです。スレッドが WaitForMultipleObjects() を実行してアイドル状態にある限り、このスレッドがオーバーラップ メソッドまたは同期メソッドを呼び出すかどうかはあまり重要ではありません。
私が最近の COM 端末を書いた方法は次のとおりです (疑似):
thread()
{
while not kill the thread event
{
WaitForMultipleObjects (open port, close port, kill the thread event)
if (open port)
{
send();
receive();
wait_for_send_and_receive();
}
}
}
send()
{
take COM_port mutex
if(there is something to send)
{
copy send_data to local_data, protect this with mutex
WriteFileEx(COM_port,
local_data,
size,
some_overlapped_struct_stuff);
handle errors
}
release COM_port mutex
}
receive()
{
take COM_port mutex
ReadFileEx(COM_port, ...);
handle errors
release COM_port mutex
}
wait_for_send_and_receive()
{
WaitForMultipleObjects (open port,
close port,
kill the thread event,
send done event from send callback routine (overlapped I/O),
receive done event from receive callback routine (overlapped I/O)
);
}
当然のことながら、COM ポートの開閉、データのシャッフルなどにさまざまな関数が必要になるため、これは非常に単純化されすぎています。
それが企業の所有物でなければ、実際に動作する製品コードを共有したいと思います:(私のプロジェクトログから判断すると、4日は少し楽観的に思えます.動作するCOMポートターミナルを製品品質レベルに開発するのに数ヶ月かかりました. COM ポート ドライバーだけでも約 1k loc であり、多くの Win API 呼び出しがあちこちにあります。