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("停止");
            }

        }
    }
  • 相关阅读:
    margin问题
    IE6里面子集尺寸大的会把父亲撑大
    第一个元素<flout>写了,想在他的旁边加一个元素.IE6会出现缝隙. 不要用margin撑开,要用flout
    兼容性,float
    HTML5的兼容问题以及调用js文件的方法
    表单
    表格的编写,课程表
    SmartThreadPool
    C# 多线程的等待所有线程结束的一个问题
    DataTable保存与读取 stream
  • 原文地址:https://www.cnblogs.com/kakaliush/p/1708463.html
Copyright © 2011-2022 走看看