Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何使用消息分派处理第二个事件循环?_Windows_Event Handling_Directshow - Fatal编程技术网

Windows 如何使用消息分派处理第二个事件循环?

Windows 如何使用消息分派处理第二个事件循环?,windows,event-handling,directshow,Windows,Event Handling,Directshow,我正在开发一个基本上是单线程的程序,它唯一的线程是主事件循环线程。因此,它的所有数据结构基本上不受临界区域之类的保护 在最近集成了一些基于DirectShowAPI的新函数之前,一切都很顺利。一些DirectShow API打开第二个事件循环,并在该循环中分派消息(即不可预测地调用其他事件处理回调)。因此,当调用第二个事件处理函数时,它可能会损坏调用DirectShow API的函数正在访问的数据结构 我有一些内核编程的经验。我想到的是,对于一个单线程程序,它应该如何处理它的数据结构,就像内核应

我正在开发一个基本上是单线程的程序,它唯一的线程是主事件循环线程。因此,它的所有数据结构基本上不受临界区域之类的保护

在最近集成了一些基于DirectShowAPI的新函数之前,一切都很顺利。一些DirectShow API打开第二个事件循环,并在该循环中分派消息(即不可预测地调用其他事件处理回调)。因此,当调用第二个事件处理函数时,它可能会损坏调用DirectShow API的函数正在访问的数据结构


我有一些内核编程的经验。我想到的是,对于一个单线程程序,它应该如何处理它的数据结构,就像内核应该如何处理每个CPU的数据结构一样。在内核中,当函数访问每个CPU的数据时,它必须禁用中断(非常类似于第二个事件循环中的消息调度)。但是,我发现没有简单的方法可以避免调用DirectShow API或防止在其中创建第二个事件循环,有没有方法?

互斥体。信号灯。锁定。不管你想叫它什么名字,这就是你需要的。

互斥体。信号灯。锁定。无论您想叫它什么名字,这都是您所需要的。

根据出现的问题和您的代码,您会想到几种可能的解决方案:

  • 在调用任何运行模式循环的API之前,请确保数据结构处于一致状态
  • 如果不可能,可以使用简单的布尔变量来保护结构。如果已设置,则只需中止对其进行更新的任何尝试,或将更新排队等待以后。另一个选项是中止上一个操作
  • 如果问题是用户生成的事件,则在操作过程中禁用有问题的菜单或按钮。或者,您可以显示一个模式对话框

  • 有几种可能的解决方案浮现在脑海中,具体取决于出了什么问题以及您的代码:

  • 在调用任何运行模式循环的API之前,请确保数据结构处于一致状态
  • 如果不可能,可以使用简单的布尔变量来保护结构。如果已设置,则只需中止对其进行更新的任何尝试,或将更新排队等待以后。另一个选项是中止上一个操作
  • 如果问题是用户生成的事件,则在操作过程中禁用有问题的菜单或按钮。或者,您可以显示一个模式对话框

  • 互斥、信号量、锁定是用于多线程的。我的情况不是多线程问题,而是重入问题。互斥、信号量、锁定都是多线程的。我的情况不是多线程问题,而是重入问题。我发现很难理解您的问题。是否要阻止DirectShow触发事件,是否要阻止DirectShow发送消息,还是要确保对数据的同步访问?如果您只是想忽略DirectShow的事件,请在处理程序中执行任何操作之前尝试检查Sender参数。他的问题是重入。他的主消息循环接收消息并调用一些事件处理程序来处理它。处理程序开始更新数据结构,在完成调用API函数之前。在内部,API函数进入一个模态循环。然后它发送一条消息,重新输入他的WindProc。然后,他的代码调用消息的处理程序,该处理程序会更新相同的数据结构,从而破坏它。即使像UpdateWindow这样无害的东西也会导致WM_MOUSEACTIVATE消息被处理。我发现很难理解你在问什么。是否要阻止DirectShow触发事件,是否要阻止DirectShow发送消息,还是要确保对数据的同步访问?如果您只是想忽略DirectShow的事件,请在处理程序中执行任何操作之前尝试检查Sender参数。他的问题是重入。他的主消息循环接收消息并调用一些事件处理程序来处理它。处理程序开始更新数据结构,在完成调用API函数之前。在内部,API函数进入一个模态循环。然后它发送一条消息,重新输入他的WindProc。然后,他的代码调用消息的处理程序,该处理程序会更新相同的数据结构,从而破坏它。即使像UpdateWindow这样无害的东西也会导致WM_MOUSEACTIVATE消息被处理。