zoukankan      html  css  js  c++  java
  • 【转发】Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on

    当您试图从单独的线程更新一个win form时,您将得到如下错误信息: 

    "Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on." 
     
    本文将介绍如何处理此错误:

    问题:

     
    重现该错误, 添加一个 progress bar 控件 (progressbar1) 以及一个  button(btnStart)到您的窗体上:.

    private void btnStart_Click(object sender, EventArgs e)
    {
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;

    System.Threading.Thread t1 = new System.Threading.Thread(startProgress);
    t1.Start();
    }
    void startProgress()
    {
    for (int i = 0; i {
    progressBar1.Value = i; //You will get error at this line
    System.Threading.Thread.Sleep(100);
    }
    }

    window.google_render_ad();

    解决方案:

    private void btnStart_Click(object sender, EventArgs e)
    {
    progressBar1.Minimum = 0;
    progressBar1.Maximum = 100;

    System.Threading.Thread t1 = new System.Threading.Thread(startProgress);
    t1.Start();
    }
    void startProgress()
    {
    for (int i = 0; i {
    SetControlPropertyValue(progressBar1, "value", i); //This is a thread safe method
    System.Threading.Thread.Sleep(100);
    }
    }


    delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
    private void SetControlPropertyValue(Control oControl, string propName, object propValue)
    {
    if (oControl.InvokeRequired)
    {
    SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
    oControl.Invoke(d, new object[] { oControl, propName, propValue });
    }
    else
    {
    Type t = oControl.GetType();
    PropertyInfo[] props = t.GetProperties();
    foreach (PropertyInfo p in props)
    {
    if (p.Name.ToUpper() == propName.ToUpper())
    {
    p.SetValue(oControl, propValue, null);
    }
    }
    }
    }

    您可以通过该解决方案来处理所有的WIndows 控件. 您所要做的是, 从上方的代码中copy SetControlValueCallback delegate 以及SetControlPropertyValue 函数 function.

    例如您想设置一个 label的内容, 使用SetControlPropertyValueSetControlPropertyValue(Label1, "Text", i.ToString());
     
    请确认您所应用的属性的值类型.在上面的Demo中 Text 是一个 string 属性. 这就是我为什么将其转换为String。
  • 相关阅读:
    编译KlayGE所需要的第三方库和工具下载
    KlayGE启用顶级域名
    Sophus和Eigen 李群李代数 简单介绍
    G2O曲线拟合1
    梯度下降
    PCL1.8单张图点云转换显示
    双目测距demo
    Kinect基于微软SDK彩图与深度图对齐
    单例模式
    zendstudio卡死
  • 原文地址:https://www.cnblogs.com/successliwei/p/3839843.html
Copyright © 2011-2022 走看看