退出我的应用Windows窗体应用程序时,我遇到了令人讨厌的竞争条件。在运行时,我必须轮询由Active X控件封装的硬件设备:
while(!pollingThreadStop)
{
//get the current status
x = axFoo-> GetStatus();
//do something
}
pollingThreadStopped=true;
在Form的结束事件中,我尝试检测用户是否正在退出并停止该线程:
private: System::Void Form1_Closing( Object^ sender, System::ComponentModel::CancelEventArgs^ e )
{
pollingThreadStop=true;
while(!pollingThreadStopped)
Sleep(10);
}
不幸的是,这似乎触发了一个竞争条件,其中axFoo可以在触发Closing事件之前开始关闭,我想因为ActiveX控件知道窗口正在关闭(?),在这种情况下它有时会在调用时死锁到GetStatus,因为硬件已经脱机。有什么方法我可以检测到用户试图在流程早期关闭Window,以便我可以及时退出轮询线程?添加一个关闭轮询然后关闭的GUI按钮确实有效,但我真的不必这样做。