问题标签 [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 回答
2736 浏览

multithreading - WaitForSingleObject 返回 WAIT_OBJECT_0 但未调用 SetEvent

在不断创建和销毁许多线程的程序中,有时会WaitForSingleObject()返回WAIT_OBJECT_0,但未SetEvent()调用预期事件。我试图在互联网上查找资料,但找不到类似的WaitForSingleObject()错误。

我编写了一个发生此错误的小型测试应用程序。

事件测试.dpr:

主线程.pas:

工作线程.pas:

回调.pas:

在这个应用程序中,我创建了许多用于循环处理的线程,以及许多不断创建和销毁的线程。所有线程都使用回调模拟来设置它们的事件。当应用程序检测到错误时,它会写入"WaitForSingleObject error"控制台。

正在使用WaitForSingleObject()SetEvent()在 中描述的线程WorkThread.pasCallBack.pas描述了一个简单的回调模拟器。并MainThread.pas管理线程。

在这个应用程序中,该错误很少发生,有时我必须等待 1 小时。但是在一个有很多win句柄的实际应用程序中,bug很快就会出现。

如果我使用简单的布尔标志而不是事件,一切正常。我的结论是这是一个系统错误。我对吗?

PS:操作系统 - 64 位应用程序 - 32 位

更新

Remy Lebeau 指出了我的错误

我全部替换CreateEvent(nil, False, False, '')CreateEvent(nil, False, False, nil),但仍然出现错误。

0 投票
0 回答
244 浏览

windows - WaitForSingleObject 和死锁

我读了一篇关于 Windows 同步的文章。

锁、死锁和同步

据说在调用KeEnterCriticalRegion()之前应该通过调用来禁用正常的内核模式APC传递KeWaitXxx()以避免死锁。

我明白。但是 AFAIK,没有像KeEnterCriticalRegion()用户应用程序这样的 API,所以WaitForSingleObject()对于死锁来说似乎是不安全的。

否则,是KeEnterCriticalRegion()内部WaitForSingleObject()调用吗?

0 投票
3 回答
406 浏览

delphi - 未提升的程序启动提升的更新程序,更新程序应等待程序完成

我有 2 个应用程序,program.exe 和 updater.exe,它们都是用 Delphi5 编写的。程序在没有管理员权限(也没有清单)的情况下运行,更新程序有一个带有“requireAdministrator”的清单,因为他必须能够在 Program-Folder 写入来更新 program.exe。

问题是启动更新程序并让他等到程序关闭。我在网上找到了不同的方法,但没有一种方法有效(在大多数情况下,第一个应用程序启动第二个应用程序并等待第二个应用程序的结束,在我的情况下,第二个应用程序应该等待第一个应用程序的结束)。

更新程序应该等待,这很容易
updater.exe

方式 1
使用 CreateProcess 启动更新程序:
program.exe

不做任何事情,仅当更新程序没有带有 requireAdministrator 的清单时才有效。如果我使用 explizit 管理员权限运行程序,它也可以工作。

方式 2 使用 ShellExecuteEx 启动更新程序:
program.exe

不起作用,MyHandle 每次运行此过程时都有不同的值(无需重新启动程序),因此更新程序无法使用它。

所以我不知道如何启动 updater.exe 并将 program.exe 的句柄写入文件中。

我对编程的这些部分不太熟悉......有人对我的问题有想法吗?

0 投票
2 回答
800 浏览

delphi - Delphi XE8:运行外部控制台应用程序、等待其结果并捕获其结果的问题

在 Windows 下的 Delphi XE8 中,我试图调用外部控制台应用程序并捕获其输出。我使用以下代码,如 Capture the output from a DOS (command/console) WindowGetting output from a shell/dos app into a Delphi app 中所述

它适用于 DOS 命令,但不适用于控制台应用程序。控制台应用程序启动并正确执行,但它挂在repeat until (Apprunning <> WAIT_TIMEOUT)循环中。我可以尝试什么来解决这个问题?

非常感谢!

0 投票
1 回答
1425 浏览

c++ - WaitForSingleObject 死锁

如果您有兴趣,请提供一些背景知识,否则您可以直接进入底部的问题:

我遇到了一个问题,我有一个无限while循环,有两个if条件检查两个事件对象状态是否变为信号状态。

事件对象正在我的 OS/BSP USB 驱动程序代码中设置,它将检测硬件 USB 连接并继续用于USB_PHY_CONN设置相应的事件对象。USB_PHY_DISCONNSetEvent()

阅读 的文档WaitForSingleObject(),并没有明确声明它必须在线程内使用,尽管多次阅读后我觉得它是隐含的,但我不是 100% 确定。

我遇到的问题是代码第一次通过 while 循环运行(即,usb 最初断开连接,然后连接,然后断开连接),我的系统运行良好并且没有挂起。但是,重新连接 USB 后,我的系统冻结了。我的设备变得无响应/UI 冻结并且代码丢失。

现在,当我终止包含上述代码的进程时,一切都会重新启动并继续正常运行。我做了一些阅读,似乎WaitForSingleObject()有可能出现死锁的风险,但我也注意到它总是在线程方面。

我的问题是WaitForSingleObject()必须在线程中使用吗?如果我在主程序的无限循环中使用它,这是否会导致死锁/系统冻结的高风险?

注意:这是一个带有 VS2008 的平台构建器 windows 嵌入式 CE 7 项目。

0 投票
2 回答
223 浏览

c++ - if 条件中的两个 WaitForSingleObject 而不是 WaitForMultipleObjects

将 2 WaitForSingleObject置于“if”条件中是否有效?我知道它可以使用WaitForMuiltipleObject重写。但我想知道我使用下面的代码是否会导致任何问题..?

0 投票
1 回答
521 浏览

c++ - ShellExecuteEx 和 WaitForSingleObject 将损坏绘制到窗口下

使用以下代码使用外部 exe 文件更新我的应用程序,当我移动此窗口时,我在下面的窗口(主应用程序和调用者)中得到了绘制损坏(不是更新或刷新)。似乎在 Windows 7 下工作正常,但在 Windows XP 下我有这个问题。

这里似乎有什么问题?

0 投票
0 回答
147 浏览

c++ - 如何向所有听众发出信号

我的应用程序中有几个进程。一个写入共享内存,而另一个使用 WaitForSingleObject 侦听全局命名互斥锁。当我在编写器进程中调用 ReleaseMutex 时,这只唤醒了一个侦听器。

写操作完成后,我需要以某种方式向所有进程发出信号。有什么方法可以唤醒所有听众,比如 c# 中的 pulseall?

0 投票
1 回答
1123 浏览

c# - WaitForSingleObject 返回 ERROR_INVALID_HANDLE

我试图确定一个进程是否仍然存在(在我检查的那一刻,我知道它可以在我检查后立即关闭)通过调用WaitForSingleObject()一个句柄 get 从Process.MainWindowHandle它可以正常工作IsIconic()但它返回WAIT_FAILEDGetLastError()一个ERROR_INVALID_HANDLE

0 投票
0 回答
226 浏览

c++ - 打印到 PDF 导致我的主应用程序在 WaitForSingleObject 调用中挂起

我们有这个应用程序,它使用 mshtml.dll 和 rundll.32.exe 来打印特定数据。在 Windows 10 中,如果我选择“Microsoft Print to PDF”或“Microsoft XPS Document Writer”作为打印机,我的应用程序将挂起。当我通过任务管理器结束任务时,才会出现“将打印输出另存为”对话框。在实际的打印机中,没有问题。

这是它的代码片段。

我已经隔离了应用程序挂起的代码,它位于 WaitForSingleObject() 调用中。它永远不会结束,它阻止了“将打印输出另存为”对话框的显示。如果我将 INFINITE 更改为 10000(10 秒),则会显示“将打印输出另存为”对话框,但如果我在实际打印机上测试打印输出并等待 10 秒时间,则不会打印任何数据,因为句柄或进程已关闭通过 CloseHandle() 调用。

希望你能帮助我。

按照 Jonathan Potter 的建议查看 MsgWaitForMultipleObjectsEx ,我通过关注此线程找到了解决方案 了解 MsgWaitForMultipleObjects