0

我正在编写一个包含一些媒体基础功能的库。我希望能够通过回调通知图书馆用户何时将网络摄像头连接到系统/从系统断开连接。MSDN 描述了如何知道相机何时断开连接,但它使用消息循环让您知道这一点。我不太了解 Windows 消息循环,但是我在这篇 MSDN 文章中读到的内容告诉我,我必须有一个窗口才能有一个消息循环,这对于库来说是不可接受的。

所以,我有几个问题:

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

  2. 我可以在不创建任何窗口的情况下做到这一点吗?setCameraChangeCallback(...)这是一个图书馆,所以如果图书馆用户打电话突然出现一个窗口,那就很奇怪了。同样,非常欢迎解释如何做到这一点(函数名称、要使用的特定参数等)。

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

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

4

1 回答 1

0

这篇 MSDN 文章告诉我,我必须有一个窗口才能有一个消息循环,这对于库来说是不可接受的。

不是这样。创建一个仅消息窗口,甚至只是一个隐藏窗口。让该窗口接收通知消息,然后转发它们。

如果您愿意,您可以选择在专用线程中执行此操作。无论哪个线程执行了创建窗口的代码,都被认为是窗口的拥有线程。消息被发送到该线程。该线程必须调度消息以便窗口接收它们。

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

更常见的方法是在最初请求接收通知的主机线程中触发事件。这意味着您的库必须要求主机应用程序发送消息。

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

于 2015-06-23T08:19:59.923 回答