屏幕有一个表示时间间隔的变量Frtime,读取数据库中的一个值。
以这个值为时间间隔刷新屏幕。
当别的程序修改了这个值,就会向屏幕发送消息(不带任何内容,只是消息)。
屏幕收到消息后重新从数据库读取这个值。一开始用的是System.Windows.Forms.Timer,后来发现只是单线程的,这种情况不行。想用System.Threading.Timer,
TimerCallback tmrCallBack = new TimerCallback(fun2);
中告诉我fun2的重载均与委托System.Threading.TimerCallback不匹配……
也不知道
System.Threading.Timer tmr = new System.Threading.Timer(tmrCallBack, null, TimeSpan.Zero, TimeSpan.FromSeconds(2));
实例化时是否允许有变量……不知道TimeSpan行不行……各种不了解……
所以请教下论坛的各路英雄,有什么好的方法,最好给下简单的代码……

解决方案 »

  1.   

    我知道是控件,但是System.Windows.Forms.Timer只是单线程控件,别的线程请求改变时间间隔的时候是没有变化的。
      

  2.   

    应该用timer的事件,不是用上面的call啥啥啥
    你在事件中调用fun2
      

  3.   


    试过,明明timer.Interval已经变了,可是按照原先时间间隔走= =
      

  4.   

    AutoResetEvent arv = new AutoResetEvent(false);
    public void Cal()
    {
       while(true)
       {
             int val = getvalfromdb();
             arv.WaitOne(val * 1000);
             //显示
        }
    }
      

  5.   

    谢谢提供思路,问下,设置完arv.set();之后,如何调用Cal();呢?
      

  6.   

    while(true)//一直循环。   只要外边通过threadpool启动新线程调用cal就行。
    如果想要有退出控制的话。 true用一个bool变量代替。
      

  7.   

    volatile bool flag = true;
            System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
            public void display()
            {
                while (flag)
                {
                    are.WaitOne(1000);
                    Console.WriteLine("display " + DateTime.Now.ToString());
                }
            }        public void StartDisplay()
            {
                System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(display));
                th.Start();
            }        public void Stopdisplay()
            {
                flag = false;
                are.Set();
            }
      

  8.   

    明白了。
    不过我的屏幕显示程序中没有新建过Thread。由于别的程序给我的屏幕发信息,即另一个线程,所以我用委托的方式使用一些方法。这个Cal,或者9楼的display()可以用委托的方式调用么?
      

  9.   

    用这个方法成功了!
    但是有一点,当程序关闭时,线程th怎么释放呢?在编译器里,虽然用ALT+F4关闭了窗口,可是依然处于调试状态(平时不这样)……
      

  10.   

    应该是Stopdisplay();放在什么地方的问题,我原先放在Form1_FormClosing中依然不管用,放在信息的侦听函数T中就可以了……
    之所以放在侦听函数中,是出于这样的情况:
    有一个负责显示内容的主函数A,现在A中调用StartDisplay()
    在构造函数中调用A,即屏幕一开始有一个显示的状态。
    侦听函数T负责接收消息,一旦接收到了消息,就用委托方式调用A刷新,我目前在调用A之前先调用Stopdisplay();
    而且StartDisplay()中我增加了一句flag = true;使flag随时变化。以便于这两个方法随时成功调用。
    总之,谢谢您提供的方法,我也是第一次听说AutoResetEvent,之前只想着Timer了……