我在主窗体里有一个很复杂的数据运算,可以看成一个很大的for循环。
我想在数据运算时,每隔1s改变下主窗体上的一个label的背景颜色。
请教大家,该如何做呢?
我用了timer控件,和System.Timers.Timer。在数据运算时,都不能更新label。谢谢

解决方案 »

  1.   

    这个问题讨论过多次:
    private void timer1_Elapsed(.....) 
    {    
         this.Invoke(new UpdateUICallBack(UpdateUI));   
    }
    private delegate void UpdateUICallBack();
    private void UpdateUI()    

      // labelColorChange;
    }
      

  2.   

    这有什么难。你定义一个Color类型的数组,装一些你要的颜色进去,每隔一秒去随机产生一个随机整数,用来当做数组下标,在将Color数组中取出的颜色付给Label,但是时间空间要用Thread来控制以免阻塞当前进程,否则会很卡
      

  3.   

    楼上xx_lzj的代码我没看懂!~~我想,先不直接说代码,而是描述下实现过程。我的理解:你的主程序在执行一个类似于For循环的操作,也就是一个死循环操作,希望每隔一段时间更新程序界面上某个控件(label)的属性。那么,我的理解,你需要使用多线程来完成这个事情。CPU同时只做一个事情,你都让他(主程序所在的线程)执行计算的死循环了,在循环结束前,是不会做别的事情的。使用多线程的法子有很多,楼上的使用UI方面的委托应该是一种方法,但我没用过——希望楼上有空能给我发个完整资料学习下。^_^至于这个多线程怎么做~~我只会相对复杂的操作,就先不说代码了,只说思路。
    我的思路是:
    (1)把纯数字计算过程放在一个函数中,开一个线程执行这个函数。
    (2)主线程,就是主程序窗口有一个timer。
    (3)循环计算过程中,插入一个暂停N毫秒当前线程的操作。 如  当前线程.Sleep(10)。让你的主线程能有机会执行,执行其timer的事件。
      

  4.   

    谢谢楼上,我用了backgroundworker来实现了。显示可以更新了。
    但出现了另外一个问题,在我的放在backgroundwroker里的有个对剪贴板操作,在新线程里面无法操作。
    这个问题该如何解决呢?