我正在使用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例程都以这种方式运行,例如
EnumProcess
,EnumWindows
等代码必须在线程的上下文中运行,如果这样的枚举例程要立即返回并异步调用回调,则它必须产生一个线程才能这样做。您可以在这里应用最少惊喜的原则!
关于c++ - EnumDisplayMonitors什么时候返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5116511/