问题标签 [waitforsingleobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2554 浏览

c++ - WaitForSingleObject 给出无效句柄

WaitForsingleobject 返回无效句柄,但我不明白为什么......

0 投票
7 回答
65122 浏览

windows - 如何在 VB6 中执行更多代码之前等待 shell 进程完成

我有一个小的 VB6 应用程序,我在其中使用Shell命令来执行程序。我将程序的输出存储在一个文件中。然后我正在阅读这个文件并使用 VB6 中的 msgbox 将输出放在屏幕上。

这就是我的代码现在的样子:

问题是 VB 程序使用 msgbox 打印的输出是文件的旧状态。是否有某种方法可以在我的 shell 命令程序完成之前保持 VB 代码的执行,以便我获得输出文件的正确状态而不是以前的状态?

0 投票
4 回答
8488 浏览

c# - 是否可以杀死 WaitForSingleObject(handle, INFINITE)?

我在关闭使用 WaitForSingleObject() 的应用程序时遇到问题,该应用程序具有无限超时。

完整的画面是这样的。我正在执行以下操作以允许我的应用程序处理设备唤醒事件:

通过以下方式注册活动:

启动一个新线程等待:

然后在目标方法中执行以下操作:

这一切正常,直到我尝试关闭应用程序时,可以预见的是,WaitForSingleObject 继续等待并且不允许应用程序正确关闭。我们一次只允许我们的应用程序的一个实例运行,我们会在启动时检查这一点。它似乎会继续运行,直到设备软复位。

有没有办法杀死 WaitForSingleObject 正在等待的句柄,强制它返回?

非常感谢。

0 投票
1 回答
1025 浏览

c++ - 具有互斥锁的Visual C++线程不阻塞

我正在使用 VC2005 进行开发,但我遇到了线程问题。

我有一个线程从队列中取出数据并发送它。但是这个线程发送一个请愿书并且必须等待发送新请愿书的答案(我想设置一个超时以防止无限超时)。

我有一个这样的线程:

但是这个 WaitForSingleObject 永远不会停止......我有这样的初始化事件:

思路是阻塞线程停止发送数据,等答案来了,解除阻塞这个线程发送新的请愿书……为什么永远不会停止???

问候

0 投票
4 回答
11996 浏览

c++ - SendMessage 与 PostMessage + WaitForSingleObject

我想知道调用 SendMessage(哪个块)和调用 PostMessage 与 WaitForSingleObject 有什么区别。想法?

0 投票
2 回答
7428 浏览

c++ - 运行 regsvr32.exe 时,带有线程句柄的 WaitForSingleObject 卡住了

我有线程 A 正在创建另一个线程 B,而不是线程 A 正在等待使用 WaitForSingleObject 等待线程 B 死亡。

问题是即使线程 B 从线程的“thread_func”返回,线程 A也没有收到信号!.

我知道,因为我在 thread_func(线程 B 的主函数)的末尾添加了跟踪(OutputDebugString),我可以看到线程 B 完成了它的执行,但线程 A 永远不会从 WaitForSingleObject 中出来。

现在,我还必须补充一点,这段代码在 COM 对象中,并且在我调用 regsvr32.exe 时会发生上述情况(它卡住了!),所以我相信线程 A 来自 DLLMain。

任何想法为什么线程 A 没有收到信号?!?!

0 投票
2 回答
3274 浏览

multithreading - MFC 中的工作线程终止

如果工作线程完成时间过长,终止工作线程的正确方法是什么?我已经阅读了几篇文章,声称应极其谨慎地使用 TerminateThread,但我找不到任何可行的替代方案。

伪代码:

这可以接受吗?所有的意见和建议都非常感谢。

我在 Visual Studio 2008 中使用 MFC/C++。在 Vista 上开发,针对 XP、Vista 和 7。

0 投票
1 回答
407 浏览

c - c 获取线程函数的返回值&UI线程卡住

我想使用一个线程来做一些当我单击一个名为button1的按钮时无法立即返回的事情, 这是我的代码:

thread1原型:

在我单击 button1 (ID:IDC_BUTTON1) 后,UI 线程被卡住了大约多长时间Sleep。如果我不使用WaitForSingleObjectexitCode总是返回 259(STILL_ALIVE)?

如何获取thread1UI 线程的返回值不能被卡住?

编辑

使用PostThreadMessage

和一条新消息DlgProc

mainThreadId是 ui 线程 ID。

threadProc

WM_FINISHED_FETCH永远不会触发的代码。

0 投票
3 回答
3599 浏览

c++ - C/++ 中的 WaitForSingleObject 和 while 循环

这是片段:prog1:

编2:

问题>它不会形成半无限循环......它进入一次就可以了。

目的?为了监控某些进程的活动(如果它崩溃我重新启动它),无限循环正在严重打击我的 CPU,我不能使用睡眠,我需要重新启动它 asasp(如果可以通过 while(1) 或 for( ;;) 请张贴)

更新

应该是 while(WaitForSingleObject(hM,INFINITE) == WAIT_ABANDONED){ ... },我没有正确复制:)。

它工作一次,然后它不会再等待,有没有办法重置句柄?


编1:

编2:

如果有人想在这篇文章上添加评论,这样它就可以工作。

0 投票
0 回答
283 浏览

multithreading - 这是我的 DirectShow 推送源过滤器(相当)防弹的 Windows 线程同步策略吗?

我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 推送源过滤器。我正在为推送源过滤器的 FillBuffer() 调用实施阻塞策略。推送源过滤器将音频数据接收到存储在缓冲区集合中的一个或多个缓冲区中。缓冲区集合中的每个方法都受临界区保护。

集合中的每个缓冲区都由不同的源提供数据,并且每个源都有自己的线程。FillBuffer() 调用会阻塞,直到集合中的每个缓冲区都有足够的数据来满足 FillBuffer() 被要求提供的数据量,因为数据混合在一起形成一个合并的缓冲区,然后返回给调用者。

这是我为避免竞争条件和死锁而设计的策略。缓冲存储集合有一个称为isEnoughData()的方法,它执行此操作:

  1. 获取保护集合中所有其他方法的相同关键部分。
  2. 迭代每个缓冲区检查以查看每个缓冲区是否有足够的数据来满足当前请求。
  3. 如果有足够的数据,则返回 TRUE
  4. 如果没有足够的数据,则获取一个用于方便阻塞的Mutex,返回 FALSE,并将请求的无法填充的字节数存储在 FNumPendingBytesRequested 中。
  5. 在返回之前,它当然会释放关键部分。

FillBuffer() 执行以下操作:

  1. 调用 isEnoughData()
  2. 如果返回 TRUE,它将混合(合并的缓冲区)数据返回给提供的Sample中的调用者。
  3. 如果为 FALSE,它会在上面概述的isEnoughData()调用期间由集合获取的Mutex上执行 WaitForSingleObject() ,从而阻塞直到出现足够的数据。当它获取Mutex时,它从集合中获取数据并将其返回给调用者,然后释放Mutex

存储集合中将数据添加到集合中任何缓冲区的所有方法在返回之前检查是否现在可以满足 FNumPendingBytesRequested。如果是这样,则释放互斥锁,从而解除对 FillBuffer() 调用的阻塞,然后获取数据并将其返回。自然,该集合在销毁时会释放Mutex 。

这对我来说似乎很防弹。我相信它可以充分保护对 isEnoughData() 的 FillBuffer() 调用和向集合添加数据的其他线程之间的竞争条件。我也看不到任何可能发生竞争条件或死锁的地方。我对此是否正确?任何有关该策略的提示或警告也值得赞赏。

最大的问题:我能看到的唯一潜在问题是,在 FillBuffer() 有机会调用WaitForSingleObject()并阻塞之前,另一个线程是否添加了足够的数据来释放Mutex 。但我的理解是,在不属于任何人的同步对象上调用WaitForSingleObject()会立即返回对象的所有权,因此这应该不是问题,因为这意味着现在可以使用必要的数据。我的理解正确吗?