实时更新 GUI

Posted

技术标签:

【中文标题】实时更新 GUI【英文标题】:Update GUI in realtime 【发布时间】:2015-09-17 09:35:18 【问题描述】:

我正在使用 SharpSSH 将命令从 windows 窗体发送到一台 linux 机器。 一切都按预期工作,只是我无法实时更新输出。命令执行完成后会出现输出。如何在输出发生时更新输出。

这是我作为后台工作者运行的代码。

private void execute_green_DoWork(object sender, DoWorkEventArgs e)
        
            List<object> argumentList = e.Argument as List<object>;
            string isp_username = (string)argumentList[0];
            string isp_password = (string)argumentList[1];
            string ssid = (string)argumentList[2];

            string stdOut = null;
            string stdError = null;
            string address = "192.168.1.100";
            string start = "Connecting...";
            this.Invoke(new MethodInvoker(delegate  progressWindow.green_update(start); ));
            System.Threading.Thread.Sleep(200);
            string user = "user";
            string pass = "password";
            string status = "Connected.....";
            this.Invoke(new MethodInvoker(delegate  progressWindow.green_update(status); ));
            System.Threading.Thread.Sleep(200);
            this.Invoke(new MethodInvoker(delegate  progressWindow.green_update("Programming....."); ));
            SshExec ssh_green = new SshExec(address, user, pass);
            ssh_green.Connect();
            ssh_green.RunCommand("cfg_green " + isp_username + " " + isp_password + " " + ssid, ref stdOut, ref stdError);
            output_green = stdOut;
            ssh_green.Close();

在上面的 output_green 被渲染到richtextbox。 熟悉SharpSSH的人,请指导一下。

【问题讨论】:

没有理由否决这个问题。请版主看看这个。这是一个真正的问题。 【参考方案1】:

这是使用同步上下文来更新 Form 的 lblTimer 标签:

CS:

public partial class MainForm : Form

    private readonly SynchronizationContext _context;

    public MainForm()
    
        InitializeComponent();
        // the context of MainForm, main UI thread
        // 1 Application has 1 main UI thread
        _context = SynchronizationContext.Current;
    

    private void BtnRunAnotherThreadClick(object sender, EventArgs e)
    
        Task.Run(() =>
                 
                     while (true)
                     
                         Thread.Sleep(1000);
                         //lblTimer.Text = DateTime.Now.ToLongTimeString(); // no work
                         UpdateTimerInMainThread(); // work
                     
                 );
    

    private void UpdateTimerInMainThread()
    
        //SynchronizationContext.Current, here, is context of running thread (Task)
        _context.Post(SetTimer, DateTime.Now.ToLongTimeString());
    

    public void SetTimer(object content)
    
        lblTimer.Text = (string)content;
    

希望对您有所帮助。

【讨论】:

以上是关于实时更新 GUI的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的线程更新 GUI (WPF)

更新 GUI:Runnables 与消息

Qt GUI 应用程序在与 gui 交互时停止实时进程

从 C# 中的类更新 GUI 的正确方法

不断更新 GUI 表单元素,使表单不会挂起

运行方法时更新 qt gui