来自托管对象的事件未得到处理
Events from managed object not getting handled
你好,我是 C++ 的新手,正在尝试处理由托管 class ServerApi::Request
引发的事件
托管 class 是一个 COM 接口,我使用 "add reference" 工具将其导入到我的 visual studio 项目中 select ServerApi.dll 文件。所有方法似乎都按预期工作,但事件处理程序 onDataReady()
从未执行。这是我的代码:
//Event receiver
ref class EventReceiver {
public:
void OnDataReady() {
cout << "dataReadyHandler called" << endl;
}
void AddHandlers(ServerApi::Request^ request) {
request->DataReady += gcnew DataReadyDelegate(this, &EventReceiver::OnDataReady);
}
void RemoveHandlers(ServerApi::Request^ request) {
request->DataReady -= gcnew DataReadyDelegate(this, &EventReceiver::OnDataReady);
}
};
void executeEventRequest() {
ServerApi::RequestManager^ requestManager = gcnew ServerApi::RequestManager();
ServerApi::Request^ request = requestManager->CreateMethod("...");
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
eventReceiver->RemoveHandlers(request);
}
request
对象在调用 Execute()
方法后引发 DataReady
事件。我知道数据几乎是通过轮询立即准备就绪的。我错过了什么?
第一次编辑
这是我最初在 request->Execute()
被调用后等待的方式:
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
clock_t beginTime = clock();
// wait for 2 seconds
while(clock() < beginTime + 2000) {
// do nothing
}
eventReceiver->RemoveHandlers(request);
Execute 方法控制没有阻塞,立即返回。
我设法通过在 executeEventRequest()
方法中使用 System::Windows::Forms::Application::DoEvents()
来处理 DataReady 事件:
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
clock_t beginTime = clock();
// wait for 2 seconds
while(clock() < beginTime + 2000) {
System::Windows:Forms::Application::DoEvents() // this line enabled events handling
}
eventReceiver->RemoveHandlers(request);
你好,我是 C++ 的新手,正在尝试处理由托管 class ServerApi::Request
引发的事件
托管 class 是一个 COM 接口,我使用 "add reference" 工具将其导入到我的 visual studio 项目中 select ServerApi.dll 文件。所有方法似乎都按预期工作,但事件处理程序 onDataReady()
从未执行。这是我的代码:
//Event receiver
ref class EventReceiver {
public:
void OnDataReady() {
cout << "dataReadyHandler called" << endl;
}
void AddHandlers(ServerApi::Request^ request) {
request->DataReady += gcnew DataReadyDelegate(this, &EventReceiver::OnDataReady);
}
void RemoveHandlers(ServerApi::Request^ request) {
request->DataReady -= gcnew DataReadyDelegate(this, &EventReceiver::OnDataReady);
}
};
void executeEventRequest() {
ServerApi::RequestManager^ requestManager = gcnew ServerApi::RequestManager();
ServerApi::Request^ request = requestManager->CreateMethod("...");
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
eventReceiver->RemoveHandlers(request);
}
request
对象在调用 Execute()
方法后引发 DataReady
事件。我知道数据几乎是通过轮询立即准备就绪的。我错过了什么?
第一次编辑
这是我最初在 request->Execute()
被调用后等待的方式:
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
clock_t beginTime = clock();
// wait for 2 seconds
while(clock() < beginTime + 2000) {
// do nothing
}
eventReceiver->RemoveHandlers(request);
Execute 方法控制没有阻塞,立即返回。
我设法通过在 executeEventRequest()
方法中使用 System::Windows::Forms::Application::DoEvents()
来处理 DataReady 事件:
EventReceiver^ eventReceiver = gcnew EventReceiver();
eventReceiver->AddHandlers(request);
request->Execute();
clock_t beginTime = clock();
// wait for 2 seconds
while(clock() < beginTime + 2000) {
System::Windows:Forms::Application::DoEvents() // this line enabled events handling
}
eventReceiver->RemoveHandlers(request);