我正在使用EnumDisplayMonitor检索有关连接到系统的显示器的信息。调用EnumDisplayMonitor要求提供一个回调函数,然后调用该回调函数以接收每个枚举的监视器的详细信息。我的问题是EnumDisplayMonitor何时返回?是立即执行还是阻塞,直到为每个枚举监视器调用了回调?我想处理将由回调更改的数据结构,并且我需要知道在EnumDisplayMonitor调用之后立即执行此操作是否安全。如果 call 不阻塞,是否有办法检查回调是否已完成?这可能是关于回调的一般问题。

例如

 BOOL CALLBACK MonitorEnumProc(
      __in  HMONITOR hMonitor,
      __in  HDC hdcMonitor,
      __in  LPRECT lprcMonitor,
      __in  LPARAM dwData)
{
   // Alter something here - e.g. Add lprcMonitor to a list.
}

int main()
{
    EnumDisplayMonitor(NULL, NULL, MonitorEnumProc, 0);

    // Can I rely on EnumDisplayMonitor to have finished making calls to
    // MonitorEnumProc at this point?
}

我已经检查了MSDN条目,这在这方面无济于事,我会通过实验确认,但我没有足够的监视器来可靠地对其进行测试。

最佳答案

它在完成调用回调函数后返回。因此,事件的顺序如下所示:

Enter: EnumDisplayMonitor
  Callback: MonitorEnumProc
  Callback: MonitorEnumProc
  Callback: MonitorEnumProc
  ...
Leave: EnumDisplayMonitor

该同类服务器的所有Windows API例程都以这种方式运行,例如EnumProcessEnumWindows

代码必须在线程的上下文中运行,如果这样的枚举例程要立即返回并异步调用回调,则它必须产生一个线程才能这样做。您可以在这里应用最少惊喜的原则!

关于c++ - EnumDisplayMonitors什么时候返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5116511/

10-13 04:35