如何跨越线程调用窗体控件?(1)

本文介绍了一种在Visual Studio中使用多线程更新UI显示状态的简单方法。通过定义子线程处理对象并在主线程中启动子线程,主线程可通过定时器不断获取子线程的状态,并更新UI显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息。

二、本节介绍最简单的方法。

   在主线程中,定义一个子线程处理的对象,通过主线程启动子线程。然后通过主线程,不断的获取最新的处理状态。当然,也可以定义一个全局变量,子线程不断更新该全局变量,而主线程定时去获取状态信息。

   主线程不断获取子线程的处理状态,可以通过定时器来完成。

   注意,子线程没有去操作UI(主线程)的任何元素。

   这种方法是一种偷换概念的方法。

 public partial class Form1 : Form     //UI线程
    {
        public subThread subPro = null;

        public Form1()
        {
            InitializeComponent();
        }


        private void 启动子线程_Click(object sender, EventArgs e)   //启动子线程
        {
            subPro = new subThread();                                      //注意,subPro是主线程类的一个变量
            ThreadStart threadFunc = new ThreadStart(subPro.Process);
            Thread thread1 = new Thread(threadFunc);
            thread1.Start();
        }

        private void button1_Click(object sender, EventArgs e)    //主线程可以定时不断的获取子线程状态,通过子线程对象
        {                
            txtDisplay.Text = subPro.count.ToString();

            thread1.Start();   //启动定时器
        }

        private void timer1_Tick(object sender, EventArgs e)   //定时器不断更新UI上,反应子线程处理状态的信息
        {
            timer1.Interval = 1000;
            this.txtDisplay.Text = subPro.count.ToString();
        }


    }


    public class subThread   // 子线程处理类
    {
        public int count = 0;
        public void Process()
        {

            bool flag = true;
            do
            {
                count++;
                Thread.Sleep(1000);
                if (count > 10000)
                {
                    flag = false;
                }
            } while (flag);
        }
    }

 

转载于:https://www.cnblogs.com/peijihui/archive/2010/04/10/1709009.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值