zoukankan      html  css  js  c++  java
  • 多线程操作(循环往listbox中添加数据)

    来自:https://www.cnblogs.com/lk-kk/p/4617012.html

    一、先造一个窗体,其中就开始按钮,暂停按钮,以及listbox文本框

    二、当点击开始的时候,数据会无限的往listbox中加,为了防止卡住和提升效率,便造了一个新的线程来执行开始操作

    复制代码
    namespace 线程Again
    {
        //首先要定义一个委托(委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递)
        public delegate void Weituo();//利用这个委托来用方法调用方法
        public partial class Form1 : Form
        {
            //定义好了委托,开始定义一个线程;
            private Thread therad;
            //定义一个bool型的变量来存储是开始还是暂停
            private bool isok=true;
            //定义一个常量
            private long i;
            public Form1()
            {
                InitializeComponent();
                //Control.CheckForIllegalCrossThreadCalls = false;//不要检查安全性(一般不用这句),如果有这句便不需要委托了
            }
    
            private void button1_Click(object sender, EventArgs e)//开始按钮
            {
                button1.Enabled = false;
                //当点击开始的时候,将数据一条条的添加到listbox1中,点暂停便会终止,因为是循环添加数据,一旦点开始变不会停下来,所以这便需要多线程操作,开始按钮有自己单独的线程
    
                //首先将线程实例化出一个
                therad = new Thread(new ThreadStart(Start)); //为button1按钮造一个新的线程,这样点button1的话,就会运行新造的这个线程,而不会影响到窗体的主线程
                therad.IsBackground = true;//确认新造的线程后台运行
                therad.Start();
    
            }
    
    
            //定义一个Start函数,用来循环放数据
            public void Start()
            {
                while (isok)//循环调用委托,改控件属性这个工作交给委托来做
                {
                    //在循环里调用委托函数
                    weituo();
                    
                }
            }
    
            //定义一个委托函数
            public void weituo()
            {
    
                //判断一下新造的(button1)线程来访问listbox1这个控件的listBox1.InvokeRequired属性是true还是false;如果是其他的线程来访问自己的线程,则返回值是ture
                if(listBox1.InvokeRequired)
                {
                    //因为是其他的线程来访问自己的线程,所以返回值是true,既然是其他的线程来访问,为了安全,必须转回到自己的线程,这就用到了委托
                    Weituo x = new Weituo(weituo);//将weituo函数变成新造的线程能够调用的
                    this.Invoke(x);//在拥有button1控件的窗体上执行这个委托
                }
                else
                {   
                    listBox1.Items.Insert(0,i);//一旦返回值是false,便将数据添到listbox1中
                    i++;
                }
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                isok = false;
                button1.Enabled = true;
            }
        }
    }
    复制代码

    三、点暂停按钮的时候停止添加数据

  • 相关阅读:
    python3.7中asyncio的具体实现
    Nginx开启gzip压缩解决react打包文件过大
    使用Promise发送多个异步请求, 全部完成后再执行
    React 轮播图实现
    scrapy学习
    我的react+material-ui之路
    QQ小橙团队排表机器人使用方法
    P5569 [SDOI2008] 石子合并 解题报告
    NOIP/CSP 做题记录
    CF923E Perpetual Subtraction 解题报告
  • 原文地址:https://www.cnblogs.com/gisoracle/p/8040250.html
Copyright © 2011-2022 走看看