处理多线程应用程序中的表单?

时间:2013-11-05 15:57:32

标签: multithreading forms messagebox

我这里有一个非常奇怪的问题。我有一个多线程程序,一个线程用于用户界面,一个线程初始化程序其余部分的所有组件。当我启动初始化线程时,用户界面线程显示一个表单(在主窗体上),带有一个进度条,向用户显示正在发生的事情(这就是为什么初始化线程是一个单独的线程,如果它是在主线程,这种形式永远不会更新,它看起来像程序崩溃)。在初始化线程中的某些点,程序可能需要请求用户输入;通常这是通过显示一个消息框来完成的。同样重要的是要注意目标PC没有键盘或鼠标,只有触摸屏界面。 现在问题是:如果我从初始化线程中放入一个消息框,则主窗体不是父窗体。这意味着如果用户在消息框外部单击,消息框将在主窗体后面,并且程序将保持到用户连接键盘,并重新显示消息框以选择答案。 我已经尝试了各种方法来解决这个问题。我已经尝试将主窗体设为父窗体,但是我遇到了交叉线程错误。我已经尝试使初始化线程调用主线程,但随后初始化继续,我无法反馈用户输入的结果。我已经创建了一个始终位于顶部的特殊消息框,但这可以防止显示错误(如果第三个线程发生错误)。我的最终想法可能会奏效,但它很麻烦,可能不是正确的解决方案。这将要求我为所有初始化步骤制定进度点,因为每个步骤完成后,我会将其标记为已完成。然后,如果初始化线程遇到它结束的问题,主线程会询问问题,然后重新启动初始化线程,跳过已经初始化的所有东西,然后提供。 我没有想法。当主线程显示消息框并提供此反馈时,如何使初始化线程暂停并等待反馈? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您的建议,调用控件最终成为解决方案,但它稍微复杂一点。由于消息框对象不能在显示之外使用,因此我无法创建要传递给委托的消息框。解决方案是创建一个messageboxproperties类,其中包含显示消息框(父,文本,标题,图标,按钮)所需的所有信息。然后我将此类的实例传递给委托,并让委托创建/显示消息框。这允许我传递任何消息框信息并在任何表单上,在正确的线程上显示它。如果有一种方法可以传递消息框,那仍然会很好,但现在这样做。感谢所有的投入!