我试图通过测试COM端口的'可打开性',然后启动一个对话窗口,允许用户做com-porty事情之前做'飞行前检查'。关闭并立即重新打开COM端口失败:为什么?
下面的代码序列,在大纲:
handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
if (handle != INVALID_HANDLE_VALUE)
{
CloseHandle(handle);
DoTheWork("\\\\.\\COM4:");
}
else
{
ShowMessage("I'm sorry Dave, I can't do that");
}
...
void DoTheWork(char * port)
{
handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
/// do lots of stuff
CloseHandle(port);
}
这里的问题:“DoTheWork”是一个久经考验的功能,以及它自己的正确执行。在第一个CreateFile返回E_ACCESSDENIED时,它只会在先前的CreateFile/CloseHandle调用后立即调用。
更糟糕的是,如果我在调试器中缓慢地逐步执行代码,它工作得很好。
看起来我需要在第一个closeHandle之后有一个Sleep(),但是这感觉像是一个黑客 - 我无法知道它必须持续多久。
为什么不把手柄打开并传递给DoTheWork? – David 2009-08-20 16:19:18
@大卫,我不想触摸系统的一个工作部分 - 但是,我现在没有选择;-) – Roddy 2009-08-20 16:28:54