程序由主窗口Form_Main和弹出窗口Form_Popup组成。主窗口里有一个Timer控件,一个Button按钮。弹出窗口里有一个ProgressBar控件。我希望通过主窗口的Timer来控制弹出窗口的进度条的渐变。所以按下主窗口Button按钮的时候会按顺序做两件事情:
1.启动Timer;
2.模态显示弹出窗口Form_Popup。
其中Timer控件在每个时间间隔都会执行我自定义的一个事件,这个事件用于改变弹出窗口的进度条控件的值。程序运行结果:点击Button按钮后,弹出窗口上的进度条真的会跟着Timer发送的值改变长度。
我的问题:Timer是不是启动了一个线程?如果不是的话,启动Timer之后,再以模态形式启动弹出窗口,应该会阻塞Timer的计时,那也就不会触发改变进度条值的事件,也就是说在我预期之中弹出窗口的进度条是不会改变的。谁能给我解释下。

//主窗口代码:包含Timer,Timer每个时间间隔都会触发我自己定义的事件,用来改变弹出窗口的进度条的值
public partial class Form_Main : Form
{
int count = 0; public Form_Popup frmPopup; //delegate must be defined in the Form which raise the event.
public delegate void DelegateProgressBar(int _value);
public event DelegateProgressBar eventProgressBar; public Form_Main()
{
InitializeComponent(); frmPopup = new Form_Popup();
eventProgressBar += frmPopup.HandleProgressBar;
} private void Form_Main_Load(object sender , EventArgs e)
{
this.CenterToScreen();
} private void btn_NotStartThread_Click(object sender , EventArgs e)
{
timer1.Start();
frmPopup.ShowDialog();
} private void timer1_Tick(object sender , EventArgs e)
{
count += 1;
if (count <= 10)
eventProgressBar(count);
else
{
count = 0;
frmPopup.progressBar1.Value = 0;
frmPopup.Close();
timer1.Stop();
}
}
}//弹出窗口代码:包含ProgressBar
public partial class Form_Popup : Form
{
public Form_Popup()
{
InitializeComponent();
} private void Form_Popup_Load(object sender , EventArgs e)
{
this.CenterToParent();
} public void HandleProgressBar(int _value)
{
progressBar1.Value = _value;
}
}

解决方案 »

  1.   

    首先,改变进度条状态只能在UI线程中进行。不管你的TIMER运行在哪个线程,但是你拥有了一把通往UI线程的金钥匙,就是事件。UI线程绑定了你的事件,所以只要事件触发,都会阻塞强制回到UI线程执行事件处理程序。
      

  2.   

    Time的控制在windows系统里有一个专门的线程控制,所有程序的timer都是它控制的。而且一旦到了超过了响应时间,响应会省略,在下一次timer计时到的时候进行响应。
      

  3.   

    http://topic.csdn.net/u/20091203/11/a1371284-07c3-4ed2-bb5e-4f522c57189f.html
      

  4.   

    "大师父"的回复让偶晕晕啊Timer控件是基于windows消息机制的。楼主也知道这点。启动Timer之后,再以模态形式启动弹出窗口,应该会阻塞Timer的计时模态对话框阻止了用户对主窗口的操作。但这不是说主窗口就不接收消息了,主窗口还是接收消息,它的消息循环还在继续。只不过是消息处理有所改变而已。比如你往主窗口上点一下,主窗口消息处理函数发现此时模态对话框还在上面,于是它就发一个beep声,然后高亮下模态对话框,提示你模态对话框还未结束。而对于定时器消息,处理方法就没有任何改变了。
      

  5.   


    明白了,模态对话框并不是阻塞了主对话框的线程,模态对话框仍然是主对话框的一部分,只是对用户而言在视觉上改变了主对话框的消息响应形式。
    ”定时器<>线程“这里说下我对这句话的理解看对不对:
    加了一个Timer控件并不意味着本程序本身增加了一个线程,但是Timer的工作原理是由操作系统所控制的另一个线程不停的向本程序发送WM_TIMER来实现的。
      

  6.   

    ”定时器<>线程“这里说下我对这句话的理解看对不对:
    加了一个Timer控件并不意味着本程序本身增加了一个线程,但是Timer的工作原理是由操作系统所控制的另一个线程不停的向本程序发送WM_TIMER来实现的。
    你只需要知道,操作系统定时把时间消息发送至你主窗口的消息队列里。
      

  7.   

    没记错的话,.NET只有三个timer类分别在:System.Windows.Form,System.Threading,和System.Timers三个命名空间底下。
    楼主10楼的理解是对的。想详细了解的话可以看看这个http://www.chinaz.com/Program/.NET/1029424D2008.html
    应该有帮助。