C ++模式对话框继续添加文本

时间:2015-08-18 01:22:45

标签: c++ mfc

我有对话框,在其中,它有OK和Cancel按钮,然后它还有一个ListBox,用于在两列中显示文本。在显示对话框后,我想继续在ListBox中添加文本。我怎样才能做到这一点?因为在我调用DoModal()来显示对话框后,代码不会继续执行。或者我应该创建两个线程(一个是显示对话框,而另一个线程继续向对话框添加文本)?

3 个答案:

答案 0 :(得分:0)

显示一个对话框会以模态方式停止进一步执行,直到您关闭该框。而不是显示模态,显示它是正常的,但使它始终在顶部,以便您可以在调用DoModal()后继续执行代码。或者,在拨打DoModal()之前,在框中填写所需的所有信息。

答案 1 :(得分:0)

如果您决定采用“双线程”方法,您将发现MFC对话框上的控件不应该从创建对话框的线程以外的线程更新或访问。即使你有指向另一个线程中可用的这些控件的指针,访问它们也不是线程安全的。无论对话是否为模态,此规则都适用。

相反,您的第二个线程需要PostMessage或SendMessage到对话框窗口,因此更新发生在创建对话框的线程上(很可能是应用程序的主UI线程)。

答案 2 :(得分:0)

让你的对话“拉”'它需要的数据,可能每秒或每100ms左右用窗口消息轮询数据源。或者,如果你去了两个线程' route(更好但更复杂的选项),让数据源在有新数据时向对话框发布一条窗口消息,然后让对话框获取所需的数据。这样做的原因是,使用现有的CDialog基础设施来获得一个行为类似于实际对话框的窗口要容易得多,相比之下,建立一个模仿对话但不是真实的模态窗口。 / p>

如果你选择了两个线程路线,那么你的分工应该是:一个完成所有UI工作的线程(包括显示对话框),以及一个生成'数据并让UI知道何时有新数据。因此,工作线程不应该执行与UI相关的任何操作,也不应该直接调用对话框上的任何方法 - 您无法从多个线程访问窗口。唯一的跨线程窗口通信应该通过窗口消息发生(即,使用:: SendMessage())。所以当然不要从另一个线程或类似的东西做myDialog-> m_theList.AddString(" blah")之类的事情。