Winform窗体里同时控制两个控件的展示或显示就要用多线程

Winform窗体里同时控制两个控件的展示或显示就要用多线程,不能用连个个计时器控件来达到效果,单线程的每个计时器执行时是独占cpu,对另外一个计时器并不响应,也就是会阻塞或屏蔽掉一个计时器,而实现方法我推荐两种
1、将波形展示用一个线程来实现,数据存储如果不在窗体视图展示可以直接在后台操作不需要单独开辟进程,可以在计时器每次触发的事件里都要创建一个新线程,这样可以不会将后面的计数程序阻塞,但不能保证数据同步,最好是在线程里将计时器暂停,线程执行完后再激活计时器。
2、用两个计数器,两个计数器的触发事件每次都创建新线程,各自线程里完成各自的逻辑,但要说明的一点是窗体控件的视图变化需要用到异步调用,不能直接附值,不然会出现异常。

给出第一种解决方法代码
C# code
//定义委托句柄
delegate void MysatusChartHandler(object sender, MysatusChartEvents e);
//控件有效性委托句柄
delegate void ActiveEventsHandler(object sender, ActiveEventArgs e);
计时器事件代码可以这么写
//计时器事件
private void timer_Tick(object sender, EventArgs e)
    //创建新线程   
    myThread = new Thread(new ThreadStart(RuningThread));
    myThread.Start();                       
}
//波形方法
private void RuningThread()
{
  //禁止控件有效性,停止计时
    Activate(false);
  int data=Convert.ToInt32(port1.Readline());
  //statusChart.Value=data;//statusChart1,波形显示控件,此方法多线程中不能使用
    SetstatusChart(data)//异步调用
  string abc=Convert.Tostring(data);
  WriteFile(abc);//存储方法,不必用异步调用
  //激活计时器
  Activate(ture);
}
private void SetstatusChart(int value)
{
    //创建波形事件参数
    System.EventArgs e = new MysatusChartEvents(value);
    //创建对象数组,要和委托方法的参数相匹配
    object[] pList = { this, e };
    //异步引用方法事件古代帝王驭人术
    BeginInvoke(new MysatusChartHandler(UpdateStatus), pList);
}
public void UpdateStatus(object sender, MysatusChartEventse)
{
  statusChart.Value = e.Value;
}
//
public class MysatusChartEvents: EventArgs
{
    private int _value = 0;
    public MysatusChartEvents(int value)
    {
        _value = value ;
    }
    public MysatusChartEvents()
    {
    }
    public int Value
    {
      get { return _value; }
    }
}
public void Activate(bool ActivateFlag)
{
    //设置控件有效性
      System.EventArgs e = new ActiveEventArgs(ActivateFlag);
    //创建对象数组,要和委托方法的参数相匹配
      object[] pList = { this, e };
    //异步引用方法事件(不同于Invoke引用,其必须等到该方法执行完,该方法立即返回)
      BeginInvoke(new ActiveEventsHandler(ActiveCompont), pList);
}
private水解度 void ActiveCompont(object sender, ActiveEventArgs e)
{
红外线报警器论文           
    timer.Enabled = e.ActiveFlag;大数据下的精准营销
}
public class ActiveEventArgs : EventArgs
{
    private bool activeFlag = true;
    public ActiveEventArgs(bool flag)
    {
        activeFlag = flag;
    }
    public ActiveEventArgs()
    {
    }
    public bool ActiveFlag
山东建筑大学 高鹏    {
        get { return activeFlag; }
电影黑名单
    }
    }

本文发布于:2024-09-21 15:25:53,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/415862.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   控件   计时器   事件   线程   委托
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议