zoukankan      html  css  js  c++  java
  • 从非创建控件的线程访问控件

    类testThread

    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace testThread
    {
        
    public class MessageSendEventArgs : EventArgs
        {
            
    public String Message;
            
    public MessageSendEventArgs(string message)
            {
                
    this.Message = message;
            }
        }
        
    class SubThread
        {
            
    public delegate void MessageSendEventHandler(object sender, MessageSendEventArgs e);
            
    //定义事件
            public event MessageSendEventHandler MessageSend;
            
    protected virtual void OnMessageSend(MessageSendEventArgs e)
            {
                
    if (MessageSend != null)
                    MessageSend(
    this, e);
            }
            
    //定义一个线程
            public System.Threading.Thread sendthread;
            
    public void Sendding()
            {
                
    while(true)
                {
                    System.Threading.Thread.Sleep(
    500);
                    
    this.OnMessageSend(new MessageSendEventArgs(DateTime.Now.ToString()));
                }
            }
            
    //开始线程函数
            public void StartSend()
            {
                sendthread 
    = new System.Threading.Thread(new System.Threading.ThreadStart(Sendding));
                sendthread.Start();
            }
            
    //结束线程函数
            public void EndSend()
            {
                sendthread.Abort();
            }
        }
    }

    那么在主窗体内,使用 Control.CheckForIllegalCrossThreadCalls = false;

    可以回到.net1.1默认可以从非主线程修改控件。也可以使用invoke方法。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace testThread
    {
        
    public partial class Form1 : Form
        {

            
    public delegate void MessageHandler(MessageSendEventArgs e);
            SubThread _subthread;                                                      
    //定义一个线程

            
    public Form1()
            {
                InitializeComponent();
               
    // Control.CheckForIllegalCrossThreadCalls = false;
                this._subthread = new SubThread();                                     //创建线程实例
                this._subthread.MessageSend += this._subthread_MessageSend;
                
    //this._subthread.MessageSend += this._subthread_MessageSend;            //订阅事件
            }
            
    public void MessageAdd(MessageSendEventArgs e)
            {
                listBox1.Items.Add(e.Message);
            }

            
    private  void _subthread_MessageSend(object sender, MessageSendEventArgs e)
            {
                 
    //实例化代理
                  MessageHandler handler = new MessageHandler(MessageAdd);
                 
    ////调用Invoke
                this.Invoke(handler, new object[] { e });
                 
    //listBox1.Items.Add(e.Message);
            }

            
    private void button1_Click(object sender, EventArgs e)
            {
                
    this._subthread.StartSend();
                
    this.listBox1.Items.Add("开始....");
            }

            
    private void button2_Click(object sender, EventArgs e)
            {
                
    this._subthread.EndSend();
                
    this.listBox1.Items.Add("停止");
            }

        }
    }
  • 相关阅读:
    python 生成器 迭代器
    廖---高级特性 切片 迭代 列表生成式
    汉诺塔
    廖---函数
    廖---控制流
    廖---list tuple dic set
    廖---字符串和编码
    MySQL常见的三种存储引擎
    mysql悲观锁以及乐观锁总结和实践
    数据库事务的四大特性以及事务的隔离级别
  • 原文地址:https://www.cnblogs.com/kakaliush/p/1708463.html
Copyright © 2011-2022 走看看