2

我正在重写一个有很多问题的 MFC 应用程序。主要问题是不稳定。

它是一个通过 USB 与外部模块通信的 GUI 应用程序。因此,它使用计时器每 n 毫秒运行一次通信堆栈。然而,定时器回调中不允许系统调用,因此程序不稳定,崩溃并挂起很多。

所以我必须重写应用程序以在后台线程中运行通信堆栈。这里的另一个问题是数据没有与演示完全分离,如果我使用另一个线程,我必须确保我保护共享资源。

因此,主要是通信堆栈将通知应用程序有新数据。这应该由工作线程处理。它运行通信堆栈,处理新消息,然后在更新数据结构时锁定数据结构,然后返回给模块。然后它向主线程发送一条带有 PostMessage 的消息以更新 GUI。

但用户也可以告诉应用程序向外部模块发送数据。这可以通过 3 种方式完成: 1. 发送一次数据。然后,主线程将向工作线程发送一条消息,以从队列中取出一条消息并将其发送到模块。2. 定期发送数据。这需要在工作线程内使用计时器,或者一个标志可能就足够了,它会在线程更新函数中的每个循环中发送数据。3. 向模块发送消息并等待响应。这将需要使用计时器来检查工作线程内的超时。在接收到消息时,工作线程必须通知主线程,以便它可以使用响应更新 GUI。

所以我需要: 1. 在单独的线程中运行通信堆栈。通讯堆栈是一个状态机,一旦检查新数据,调用它就会运行。其中没有while循环。您还可以调用其 API 中的函数来发送数据。

  1. 当事情发生时,向主线程发送消息以更新 GUI。

  2. 向工作线程发送消息,告诉它从应用程序发送数据。

所以我的问题是: 1. MFC 使用文档/视图模型。我很难找出将其与我想做的事情相匹配的最佳方法,或者我是否想部分放弃它(跳过文档并拥有自己的数据存储方式)。* 我如何最好地组织我的数据?有一个包含所有应用程序数据的大结构,然后工作线程和主线程在访问它时都必须锁定它?* 当我向主线程发送消息以更新 GUI 时,我如何最好地将消息映射到函数?使用 MESSAGE_MAP?但是消息映射是针对窗口而不是线程的?我需要确定只有主线程才能访问 GUI。我需要将 GUI 中的每个不同更改映射到某个功能。这是很多消息,因为 GUI 中没有一个统一的显示,而是有很多不同的选项卡(消息日志、对象、

  1. 如何处理消息?由于工作线程可以通过正常运行和当应用程序告诉它发送消息时访问堆栈,所以我必须在进行另一个调用之前完成对堆栈的一次调用。如果线程更新总是在处理新消息之前完成它所做的事情,这不是问题。或者当计时器命中或我从主线程收到一条新消息并且它也开始处理堆栈时,我是否可能在堆栈内?也许我不仅要为其他线程锁定堆栈,还要确保工作线程本身不会“同时”以两种方式访问​​它。
4

1 回答 1

2

重新消息和消息映射:

Windows 消息队列不会中断您的程序或线程。消息在队列中等待,直到您返回消息循环,然后它会出列并分派下一条消息(如果有任何消息正在等待)。

您是正确的,消息映射(在主线程中)适用于 Windows。您的工作线程必须将消息发布或发送到主线程窗口。如果您有很多这样的消息,最好将它们全部发布到主窗口(CMainFrame)。为每条消息将 ON_MESSAGE 项放入 CMainFrame 映射中。然后 CMainFrame 中的处理函数可以适当地调用其他窗口来更新 GUI 显示。

于 2013-08-14T17:04:52.127 回答