C++模态对话框继续添加文本
C++ Modal dialog box continuing adding texts
我有一个对话框,里面有“确定”和“取消”按钮,还有一个用于在两列中显示文本的列表框。显示对话框后,我想继续将文本添加到 ListBox 中。我怎样才能做到这一点?因为我调用DoModal()显示对话框后,代码并没有继续执行。或者我应该创建两个线程(一个是显示对话框,而另一个线程继续向对话框添加文本)?
显示对话框会以模式方式停止进一步执行,直到您关闭该对话框。不要以模态方式显示它,而是以正常方式显示它,但始终将其置于顶部,以便您可以在调用 DoModal()
后继续执行代码。或者,在您调用 DoModal()
.
之前,用它需要的所有信息填充该框
如果您决定采用 "two threads" 方法,您会发现 MFC 对话框上的控件不应从创建对话框的线程以外的线程更新或访问。即使您在另一个线程中有指向这些控件的指针,访问它们也不是线程安全的。无论对话框是否为模态,此规则都适用。
相反,您的第二个线程需要将 PostMessage 或 SendMessage 发送到对话框 window,因此更新发生在创建对话框的线程上(很可能是应用程序的主 UI 线程).
让您的对话 'pull' 成为它需要的数据,也许每秒或每 100 毫秒左右用 window 消息轮询数据源。或者,如果你走 'two threads' 路线(更好但更复杂的选择),让你的数据源 post 在有新数据时向你的对话框发送 window 消息,然后让对话框获取它需要的数据。这样做的原因是使用现有的 CDialog 基础设施来获得一个表现得像实际对话的 window 比构建一个表现得像对话但实际上不是的模态 window 要容易得多.
如果你确实走双线程路线,你的分工应该是:一个线程完成所有 UI 工作(包括显示对话框),另一个线程 'generates' 数据和让 UI 知道何时有新数据。所以工作线程不应该做任何与 UI 相关的事情,也不应该直接调用对话框上的任何方法——你不能从多个线程访问 windows。唯一的跨线程 window 通信应该通过 window 消息发生(即使用 ::SendMessage())。所以当然 不要 从另一个线程做类似 myDialog->m_theList.AddString("blah") 或类似的事情。
我有一个对话框,里面有“确定”和“取消”按钮,还有一个用于在两列中显示文本的列表框。显示对话框后,我想继续将文本添加到 ListBox 中。我怎样才能做到这一点?因为我调用DoModal()显示对话框后,代码并没有继续执行。或者我应该创建两个线程(一个是显示对话框,而另一个线程继续向对话框添加文本)?
显示对话框会以模式方式停止进一步执行,直到您关闭该对话框。不要以模态方式显示它,而是以正常方式显示它,但始终将其置于顶部,以便您可以在调用 DoModal()
后继续执行代码。或者,在您调用 DoModal()
.
如果您决定采用 "two threads" 方法,您会发现 MFC 对话框上的控件不应从创建对话框的线程以外的线程更新或访问。即使您在另一个线程中有指向这些控件的指针,访问它们也不是线程安全的。无论对话框是否为模态,此规则都适用。
相反,您的第二个线程需要将 PostMessage 或 SendMessage 发送到对话框 window,因此更新发生在创建对话框的线程上(很可能是应用程序的主 UI 线程).
让您的对话 'pull' 成为它需要的数据,也许每秒或每 100 毫秒左右用 window 消息轮询数据源。或者,如果你走 'two threads' 路线(更好但更复杂的选择),让你的数据源 post 在有新数据时向你的对话框发送 window 消息,然后让对话框获取它需要的数据。这样做的原因是使用现有的 CDialog 基础设施来获得一个表现得像实际对话的 window 比构建一个表现得像对话但实际上不是的模态 window 要容易得多.
如果你确实走双线程路线,你的分工应该是:一个线程完成所有 UI 工作(包括显示对话框),另一个线程 'generates' 数据和让 UI 知道何时有新数据。所以工作线程不应该做任何与 UI 相关的事情,也不应该直接调用对话框上的任何方法——你不能从多个线程访问 windows。唯一的跨线程 window 通信应该通过 window 消息发生(即使用 ::SendMessage())。所以当然 不要 从另一个线程做类似 myDialog->m_theList.AddString("blah") 或类似的事情。