gpt4 book ai didi

c# - 使用 Windows 窗体从主窗口更新无模式对话框

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:51 24 4
gpt4 key购买 nike

我正在开发 C#/.NET 3.5/Windows 窗体程序。我想创建一个无模式对话框,然后使用从主窗体生成的信息更新它。我发现了其他方向的几个例子——对话框中的信息更新了主窗口,但我在相反的方向上遇到了麻烦。对话框中的 GUI 无法正常运行。鼠标光标是一个沙漏。我有时会看到更新,但我经常会看到一个纯白色框、曾经位于对话框顶部的其他窗口的残余,或者它卡住。

最终对话框会显示更复杂的信息,但现在我只是想复制一个在主窗口上显示为标签的计数器。要启动对话框,我执行以下操作:

    bool secondWindowOpen = false;
Thread secondWindowThread;
MyPopupWindow secondWindow;

delegate void TextBoxDelegate(string message);

private void buttonPop_Click(object sender, EventArgs e)
{
// If the second window is not open, then open it
if (!secondWindowOpen)
{
secondWindowOpen = true;

secondWindow = new MyPopupWindow();
secondWindowThread = new Thread(secondWindow.MyMethod);
secondWindowThread.Start();

}
else // Close the second window
{
secondWindowOpen = false;
secondWindow.ShouldStop = true;

secondWindowThread.Join();
}
}

我使用以下代码更新计数器:

if (secondWindow != null)
{
secondWindow.CounterText = args.FrameNumber.ToString();
}

控制无模式对话框的代码如下所示。我承认设置文本字段的代码可能是错误的,但这是我目前所做的最好的事情(Invoke 调用给我带来了麻烦)。

public partial class MyPopupWindow : Form
{
public MyPopupWindow()
{
InitializeComponent();
}

public bool ShouldStop
{
get { return shouldStop; }
set { shouldStop = value; }
}
private bool shouldStop = false;

public void MyMethod()
{
this.Show();
this.Refresh();

while (!shouldStop)
{
Thread.Sleep(100);
labelCounter.Text = CounterText;
Refresh();
}

this.Close();
}

public string CounterText;
}

我的主要问题如下:当只需要更新自己的 GUI 元素时,将无模式对话框放入第二个线程的最佳方法是什么?从主窗口/线程更新这些 GUI 元素的最佳方法是什么?谢谢!

最佳答案

表单的工作方式是核心,如果程序是一个处理消息并将它们传递给要处理的表单的循环。如果您的表单永远不会将控制返回给您的消息循环,您的程序将停止正常工作。您已尝试通过添加更多线程来解决此问题,但这种方式本身就会带来痛苦。

您不能在线程中执行此操作,因为应用于表单的所有操作都必须在 UI 线程中完成。您可以使用 BeginInvoke 将诸如 Invalidate 之类的调用传递回 UI 线程,但这真的很困惑 - 编写在一个 UI 线程上运行的协作窗口比触发大量线程然后尝试将 UI 线程插入要好得多为他们做事。

为此,您需要创建表单,然后将控制权返回给您的消息处理循环。在未来的某个时间,您可以通过单击按钮等事件关闭窗口。如果您需要根据任何事件更新窗口,您可以在事件处理程序中调用 invalidate,然后返回。

关于c# - 使用 Windows 窗体从主窗口更新无模式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com