2015-06-23 18 views
0

我正在编写一个封装了一些媒体基础功能的库。我希望能够通过回调网络摄像头与系统连接/断开连接的方式通知图书馆用户。 MSDN describes how to know when a camera is disconencted,但它使用消息循环让你知道这一点。我不太了解Windows消息循环,但是我在this MSDN article中读到的内容告诉我必须有一个窗口才能有消息循环,这对于库是不可接受的。使用Windows消息循环来接收我正在写的库中的事件

所以,我有几个问题:

  1. 我可以在一个新的线程创建一个消息循环,并接收由第一链接描述的通知消息? (我希望它在一个新线程中,以便它不会阻止库用户的线程,那么库用户调用setCameraChangeCallback(...),这会启动内部的消息循环。)如果是这样,我应该使用哪些创建消息循环的函数?

  2. 我可以在不创建任何窗口的情况下执行此操作吗?这是一个图书馆,所以如果一个图书馆用户名为setCameraChangeCallback(...)并且突然出现一个窗口,那将会非常奇怪。再次,对如何做到这一点的解释(函数名称,使用的特定参数等)非常受欢迎。

  3. 我的库可以在Windows应用程序中没有问题的情况下使用吗?这意味着使用我的库的Windows应用程序可能已经创建了一个窗口,并且它自己的消息循环正在运行。我的消息循环在单独的线程中运行会干扰库用户的消息循环吗?如果是这样,如何避免这种情况?

  4. 是否有什么阻止我创建两个或多个带有消息循环的线程,每个线程都被注册以获取相机更改事件的通知?

回答

0

这MSDN文章告诉我,我必须为了有消息循环,这是一个图书馆不可接受的窗户。

并非如此。创建一个message only window,甚至只是一个隐藏的窗口。让该窗口收到通知消息,然后转发它们。

如果您愿意或不愿意,您可以选择在专用线程内完成此操作。无论哪个线程执行创建窗口的代码都被认为是窗口的拥有线程。消息被发送到该线程。该线程必须发送消息才能让窗口接收它们。

从表面上看,你可能会认为在专用线程中创建窗口并将其与主机应用程序隔离会更清晰。这有好处,但成本是,你需要考虑当你想转发通知事件时会发生什么。您收到的消息将到达您的专用线程。如果直接转发事件,则库的主机将最终在专用线程中异步执行代码。那真的是你想要的吗?

更常见的方法将会看到最初请求接收通知的主机线程中触发的事件。这意味着你的库将不得不要求主机应用程序分派消息。

显然你在这里有一些选择。但底线是你不应该相信库代码不能创建窗口。 Windows不需要显示,只有消息窗口是专门为您的使用场景设计的。