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

windows - 为什么 WaitForSingleObject(INVALID_HANDLE_VALUE, INFINITE) 阻塞?

为什么

堵塞?它不会返回错误消息。检查句柄对于INVALID_HANDLE互斥锁来说是愚蠢的,因为我需要一个互斥锁来访问互斥锁句柄......

WAIT_FAILED顺便说一句:如果句柄关闭,它会返回。

0 投票
2 回答
961 浏览

winapi - Win32互斥锁不等待

我正在创建一个实现进程间通信的应用程序。为此,我设置了一个共享缓冲区,它似乎工作正常。现在,我需要一种方法让数据生成应用程序(用 c++ 编写)告诉数据接收应用程序(用 freepascal/lazarus 编写)何时应该读取数据。

我试图为此目的使用互斥锁。我对windows api编程没有太多经验。

所以,我的问题是,在下面的 FreePascal 代码中,互斥锁不会等待。我可以调用 TMutex.Wait() 函数,它不会返回错误或任何东西,但它根本不会等待。

构造函数 TMutex.Create(sName: AnsiString);
开始
  sName := 'Local\Mutex'+sName;
  hMutex := CreateMutexA(
        nil, // 默认访问
        True, // 最初不拥有
        PChar(sName)); //
  如果 hMutex = 0 则命名为互斥体 然后
  开始
    raise Exception.Create('互斥体创建失败');
  结尾;
结尾;

析构函数 TMutex.Destroy;
开始
  关闭句柄(hMutex);
结尾;

程序 TMutex.Wait;
开始
  if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('debug: wait returned something');
结尾;

程序 TMutex.Post;
开始
  ReleaseMutex(hMutex);
结尾;

0 投票
1 回答
2095 浏览

windbg - WaitForSingleObject() 非常奇怪的 windbg 行为

下面是我的程序,当进程在使用 windbg 的 WaitForSingleObject() 调用中被阻塞时,我试图获取调用堆栈。奇怪的是当进程阻塞时,windbg 只打印出非常奇怪的堆栈。



请注意,如果我取消注释该while(1)行,则 windbg 可以识别该进程在_tmain函数中阻塞。

谢谢。斌

0 投票
1 回答
140 浏览

debugging - 识别挂起两个第 3 方可执行文件的同步对象

我正在使用第 3 方工具,它使用第 4 方插件。有时,该工具会在启动时挂起。查看堆栈跟踪,我可以看到有几个线程正在 WaitForSingleObject 上等待,我敢打赌它们会互相阻塞。一些线程从第 3 方工具开始,一些从第 4 方插件开始。

我想做的是向 3rd 方工具供应商提出最详细的投诉,假设这是它的错(我不相信他们的本地支持会自己获取这些详细信息)。为此,我想:

  1. 找出当前等待的同步对象是什么
  2. 找出谁创建了这些同步对象

目前手头的工具是 VS2005、WinDbg 和 Process Explorer。操作系统是 Window 7 64 位。有什么建议么?

0 投票
2 回答
277 浏览

c++ - 为什么我的变量在 WaitForSingleObject 之后没有保持状态?

我正在为网络类实现 Go Back N 协议。我正在使用 WaitForSingleObject 来了解接收器线程上的套接字何时在其中包含数据:

对于 Go Back N,我必须一次向接收方发送多个数据包,并对数据进行操作,然后将 ACK 数据包发送回发送方。我有一个变量 expectedSEQ ,每次发送 ACK 时都会递增,以便知道数据包是否乱序到达。

但是,当第一个数据包到达时,我的调试器告诉我,expectedSEQ 已经增加,但是当处理下一个数据包时,expectedSEQ 仍然是它的原始值。

有人知道为什么会这样吗?如果我这样写一个 if 语句

第二个数据包正确注册并发送确认。显然,这不适用于任何数量高于 2 的数据包。

我尝试将整个部分(包括原始的 WaitForSingleObject)包装在一个信号量中,试图让一切都等到变量增加之后,但这也不起作用。

谢谢你的帮助!

埃里克

每个请求:更多代码!

0 投票
5 回答
9912 浏览

multithreading - 这是等待 Thread.finalization 并保持我的应用程序响应的正确方法

实际上我正在使用这段代码并且工作正常,但我想知道是否是正确的方法。

0 投票
1 回答
1058 浏览

multithreading - 多线程 Delphi 7 App - 应用程序终止问题

我有一个 TThread 的后代和一个对象列表,每个对象都有自己的此类线程的副本以及使用 CreateEvent() API 创建的 Event 对象。

不同的对象通过事件触发相互交互。即每个线程必须等到某个其他线程将触发它的事件。当然,有一个“主”线程,它永久工作,因此永远不会发生自阻塞。该系统在每个对象中的 Execute 方法结束之前都可以正常工作。

当我试图中断所有线程时出现问题,例如通过应用程序关闭。在这种情况下,我需要一些调用每个线程的 Terminate 方法的外部函数:

此函数位于 Form.OnClose() 事件中。

问题是大约两个线程正常终止,但其他所有线程都在 WaitForSingleObject() 调用中停止:

所有线程都在该行停止(挂起)。上面标记,尽管设置了超时值。

有任何想法吗?

我正在使用 Delphi 7 和 Win XP。

提前致谢。

跟进 -

我发现问题已在 Execute() 方法中的 Synchronize() 调用中得到解决。我不明白这里有什么问题。Synchronize() 调用通常的东西,比如视觉控件更新,仅此而已。

正如调试器所示,我的线程中没有一个挂在某个 WaitForSingleObject() 调用上,但这不是我在 Execute() 方法中用来协调不同线程的方法,而是另一个调用。我可以假设它在这里:

有没有人可以告诉我我的代码有什么问题?我从来没有听说过不允许从 Execute() 方法中调用 Synchronize() ......

0 投票
4 回答
3943 浏览

php - PHP,暂停脚本执行,直到另一个正在运行的脚本发出事件信号?

我希望一个 PHP 脚本等待另一个脚本执行期间发送的事件。

用户 A 和用户 B 都是我网站的访问者。当用户 A 访问 index.php 时,页面开始执行,但直到用户 B 也访问 index.php 才返回。(该页面仅在两个用户都连接到 Web 服务器时显示,例如:就像两个守卫通过同时转动钥匙打开保险箱。)

实现这一点的一种方法是让 index.php 暂停其执行,直到收到由其他用户访问 index.php 引起的通知。

为此,我查看了

  1. 自由事件;但它似乎不允许在信令期间发送“ID”或“字符串”。
  2. 来自梨的 Event_Dispatcher;但它在“脚本之间”不起作用。
  3. PHP共享内存函数;但似乎不能等到内存改变。
0 投票
2 回答
1293 浏览

winapi - 我怎么知道 CreateProcess 何时真正启动了一个进程?

我遇到了麻烦,归结为希望CreateProcessStartProcess。问题是在某些情况下,它创建CreateProcess进程时返回true,但系统无法启动进程。例如,即使启动者的其中一个导入无法解析,也会成功。CreateProcess

根据我希望通过启动此过程完成的具体目标,可能有十几个建议。但是,我担心这些建议都不可能有用,因为我不希望通过启动这个过程来完成任何特别的事情。

一个示例建议可能是调用WaitForSingleObject进程句柄,然后调用GetExitCodeProcess. 但我等不及进程退出,因为它可能会永远存在。

另一个示例建议可能是 call WaitForInputIdle,如果我希望通过我可以合理地期望启动者创建的窗口与启动者进行通信,这将很有效。但我不希望这样,我也不能合理地期待这一点。据我所知,启动者是一个控制台进程和/或永远不会有消息队列。同样,我不能等待(带着启发式意图)找出答案。

事实上,我不能假设关于发射者的任何事情。

为了更好地了解我在这里的想法,让我们看看问题的另一面。如果该过程没有启动,我需要一个错误代码来告诉我如何建议用户。如果导入全部解决并且主线程意识到它即将跳转到 CRT 启动代码(或等效代码),并且我得到的错误代码是ERROR_SUCCESS,太好了!但我实际上对启动器不感兴趣,只是希望在启动器中提供良好的用户体验。

哦,还有一件事:我希望这很简单。我不想写调试器。:-)

想法?

0 投票
2 回答
519 浏览

delphi - 如何将字符串或信息发送到我在 Delphi 7 中使用 Createprocess 打开的进程

如何将字符串发送到我在 createprocess 的帮助下打开的进程?

我在 Stackoverflow 的帮助下写了这样的东西:

所以我想要的是在进程完成时(就在waitforsingleobject之后)写一行然后按“enter”按钮,最后在完成后关闭进程。有谁知道如何与外部进程交互?在编程方面,我是一个完全的新手。

此致