Windows C++ 32 位 DLL 计时器线程中的奇怪行为

Windows C++ 32-bit DLL Strange Behavior in Timer Thread

提问人:theDickChuck 提问时间:10/18/2022 更新时间:10/18/2022 访问量:39

问:

我只是在学习如何纠正DLL。该项目最终将成为音乐播放器的插件,并基于 Winamp 5.X。

我想创建一个窗口来显示有关定期更新的播放歌曲的信息,但它不是一个“可视化”插件,根据定义,它是由主程序反复调用的。我需要一个计时器,另一个来源建议使用 CreateTimerQueueTimer(),它启动一个单独的线程来接收超时事件,而不是无限循环和检查窗口消息的停止条件。我对主程序中的多线程架构(如果有的话)一无所知,所以我同样不想只是循环播放“睡眠”间隔然后刷新输出。

  1. 这种方法似乎奏效了。它基于回调函数:
char message[12] = "Hallo World";

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN reserved)
{
    message[1] += 1;
    MessageBoxA(NULL, message, "Dummy", MB_OK);
}

第一个弹出窗口显示“Hallo World”,第二个弹出窗口显示“Hbllo World”,依此类推。

谜团在于,当我在 CALLBACK 中切换两行代码时,所有弹出窗口(每 10 秒创建一次)都显示“Hallo World”。我不明白为什么会这样,我认为在我明白这里发生了什么之前,我不应该尝试继续执行更复杂的任务。

一如既往,非常感谢任何帮助。

C++ 多线程 DLL 计时器 回调

评论


答:

0赞 theDickChuck 10/18/2022 #1

好吧,我有点想通了。以为它可能会帮助其他人离开帖子。

在之前的测试中,我没有在生成新弹出窗口 MessageBox 之前关闭弹出窗口 MessageBox。在进一步的测试中,当我关闭出现的框时,这两种行为都会按预期递增。

不过,如果有人想发表评论,我对我对发生的事情的理解并不完全放心。

评论

0赞 Christian Halaszovich 10/18/2022
发生的情况是这样的:仅在用户关闭该框后返回。因此,在切换两行代码的情况下,会发生这种情况:只要消息框保持打开状态,就永远不会被执行。MessageBoxA()message[1] += 1;