Visual c++ MFC/Activex并启动它';waitforsingleobject之后的evnet

Visual c++ MFC/Activex并启动它';waitforsingleobject之后的evnet,visual-c++,Visual C++,我的项目是一个包含事件的对话框库和activeX容器。 当我调用activex的一个函数并等待触发它的事件(使用WaitForSingleObject)时,应用程序停止,事件直到超时才发生,在超时后它将发生 void COcxTesDlg::OnBnClickedButton1() { hEvent = CreateEvent(NULL, TRUE, FALSE, L"testEvent"); ocxObj.ocxFunction(); DWORD res = ::WaitForSingleOb

我的项目是一个包含事件的对话框库和activeX容器。 当我调用activex的一个函数并等待触发它的事件(使用WaitForSingleObject)时,应用程序停止,事件直到超时才发生,在超时后它将发生

void COcxTesDlg::OnBnClickedButton1()
{
hEvent = CreateEvent(NULL, TRUE, FALSE, L"testEvent");
ocxObj.ocxFunction();
DWORD res = ::WaitForSingleObject(hEvent, 10000);
if(res != WAIT_OBJECT_0)
    AfxMessageBox(L"Time Out");
else
    AfxMessageBox(L"before Time Out");

//--- to do some works after ocx event
//---
}

void COcxTesDlg::ocxEventFunc()
{
   SetEvent(hEvent);
}
我总是看到“超时”消息框,但如果我不调用WaitForSingleObject(),则ocxEventFunc()发生的时间会早于1000毫秒

我想在活动结束后做一些工作,不用等太久。
请帮帮我。

当然了:你让你的程序等待,它也在等待

根据您对试图执行的操作的描述,您的设计从根本上被破坏了:您在一个消息处理程序中,在主线程中,您调用了
WaitForSingleObject
。这将暂停该线程的执行,该线程将处理所有用户界面(如果只有一个线程,则会处理您的程序),直到发出事件信号或超时过期为止

你应该重新考虑你的设计。如果不了解更多,就不容易提出替代方案。一种可能性是:

记下开始时间(例如,调用
GetTickCountEx
并存储结果)


循环时
开始时间-当前时间
值。在循环内部调用
WaitForSingleObject
,并使用
0
指定超时。该调用不会阻塞,并将立即返回:如果返回
WAIT\u OBJECT\u 0
,则OCX已完成。如果返回
WAIT\u TIMEOUT
,则表示OCX尚未完成。然后,您可以做任何您想做的工作。

您已经有了一个在事件发生时调用的函数。使用它

void COcxTesDlg::OnBnClickedButton1()
{
ocxObj.ocxFunction();
}

void COcxTesDlg::ocxEventFunc()
{
//--- to do some works after ocx event
//---
}

我需要一些对象,做一些工作,它们只需在“OnBnClickedButton1”功能中即可访问。然后我不能在事件函数中编写'some works'代码,而是调用waitforsingleobject,我调用AfxMessageBox(L“Please wait…”),这不会使对话框事件停止,然后我的ocx事件发生。ocx事件后,用户可以关闭消息框。