小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C# 多線程控制控件實(shí)例(invoke,控件的委托方法)

 長江黃鶴 2021-08-06
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace treadTest
{    
    //定義委托
    public delegate void ListBoxDelegate(); 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //委托處理方法(關(guān)聯(lián)與ListBoxDelegate)
        private void ListBox()
        {
            if (!listBox1.InvokeRequired)//如果在UI主線程操作ListBox,
            {
                listBox1.Items.Add(++CommonData.num);//則直接進(jìn)行控件操作,“與UI主線程相關(guān)聯(lián)”
                listBox1.SelectedItem = listBox1.Items[listBox1.Items.Count - 1]; 
            }
            else//如果是在另一線程操作ListBox,則啟用委托
                listBox1.Invoke(new ListBoxDelegate(listShow));
        }
        
        //定義對(duì)UI主線程控件的操作,“與AddAuto相關(guān)聯(lián)”。
        private void listShow()
        {
            listBox1.Items.Add(CommonData.num);
            listBox1.SelectedItem = listBox1.Items[listBox1.Items.Count - 1]; 
        }
        //定義線程函數(shù)
        private void AddAuto()
        {
            while (CommonData.Flag == 0)
            {
                CommonData.num++;
                Thread.Sleep(1000);
                ListBox();//不能直接控制UI上的控件,所以用該方法選擇使用委托
            }
        }
        //在click事件中啟動(dòng)多線程
        private void btnStart_Click(object sender, EventArgs e)
        {
            //線程標(biāo)志置0,表示開啟線程
            CommonData.Flag = 0;
            //定義 ThreadStart的委托類型的參數(shù),并使該委托指向線程函數(shù)
            ListBoxDelegate mycn = new ListBoxDelegate(AddAuto);
            //實(shí)例化線程
            Thread insertTxt = new Thread(new ThreadStart(mycn));
            //啟動(dòng)線程
            insertTxt.Start();      
        }

        private void btnAbort_Click(object sender, EventArgs e)
        {
            CommonData.Flag = 1;
        }
        private void btnCtrlMain_Click(object sender, EventArgs e)
        {
            ListBox();
        }
        private void btnReset_Click(object sender, EventArgs e)
        {
            CommonData.num = 0;
        }
        private void btnClear_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }
        private void btnQuit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


    }
    
    //全局變量解決方案
    public class CommonData
    {
        private static int _Flag = 0;
        private static int _num = 0;
        public static int Flag
        {
            get { return _Flag; }
            set { _Flag = value; }
        }
        public static int num
        {
            get { return _num; }
            set { _num = value; }
        }
    }
}


總結(jié):

        要使用多線程控制UI控件,必須用委托實(shí)現(xiàn)。調(diào)用控件的Invoke方法(Invoke方法的參數(shù)是一個(gè)委托類型的參數(shù))。

實(shí)現(xiàn)步驟:

         1.聲明委托。

          2.聲明委托處理函數(shù)(判斷是主線程控制UI控件,還是Invoke(多線程)控制UI控件)。

         3.聲明一個(gè)線程實(shí)例,將線程函數(shù)的委托傳入ThreadStart()。

         4.開啟該線程。

         5.定義該線程函數(shù),欲控制UI控件,則調(diào)用第2步的委托處理函數(shù),他將自己判斷選擇用Invoke。

         6.定義Invoke需要調(diào)用的函數(shù)(如本例的listShow函數(shù))

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多