【问题标题】:PocketPC c++ windows message processing recursion problemPocketPC c++ windows消息处理递归问题
【发布时间】:2010-12-10 11:47:57
【问题描述】:

我在似乎与 Pocket PC 上的 Windows 消息传递有关的大型应用程序中遇到问题。我拥有的是一个用 c++ 编写的 PocketPC 应用程序。它只有一个标准的消息循环。

while (GetMessage (&msg, NULL, 0, 0)) { { TranslateMessage (&msg); 调度消息 (&msg); } }

我们也有标准的 dlgProc。在 dlgProc 的切换中,我们将调用专有的 3rd 方 API。此 API 使用套接字连接与另一个进程进行通信。我看到的问题是这样的:每当两个相同的消息快速进入(用户点击屏幕两次太快,不应该)时,似乎创建了递归。 Windows 开始处理第一条消息,使 api 进入线程安全状态,然后跳转到处理下一条(相同的 ui)消息。好吧,因为第二条消息也进行了 API 调用,所以调用失败了,因为它被锁定了。由于这个遗留系统的设计,API 将被锁定,直到递归返回(这也是由用户触发的;因此它可以被锁定整个工作日)。我正在努力弄清楚为什么会发生这种情况以及我能做些什么。这是因为 Windows 识别套接字通信需要时间并抢占它吗?有没有办法可以强制此 API 调用在抢占之前完成?有没有办法可以减慢消息处理或重新排队消息以确保第一个将执行(捕获它并将 PostMessage 返回到自身没有工作)。我们不想在第一次调用完成时锁定 ui。

非常感谢任何见解!谢谢!!

【问题讨论】:

    标签: c++ windows recursion message-queue pocketpc


    【解决方案1】:

    您可以通过例如同步对 API 的访问。一个互斥体并将传入的作业保存在本地容器中,直到当前作业完成使用它。

    【讨论】:

    • 我试图用互斥锁和临界区来包装调用,但都没有成功。我怎样才能保留即将到来的工作?您的意思是在互斥锁被锁定时将所有消息推送到另一个队列中吗?
    • 是的,将消息保存在队列中或其他可以告诉您必须做什么工作的东西中。为了更容易,我总是将消息放入队列中,并在最后一个完成时读出一个。
    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2012-03-07
    • 2012-07-22
    相关资源
    最近更新 更多