程序由主窗口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.启动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;
}
}
解决方案 »
- 如何数字转换为中文大写
- Assembly.CreateInstance("XXX.XXX.XXXX")返回空,急求!!!
- asp.net操作excel权限问题
- C# 发送邮件 如何在邮件中插入图片或链接 或让接受者看到的内容是web形式的
- C#中ListView的问题
- 请问为什么toolbar图标下的字体显示不出来?
- 【发布】★通过给出的求值运算公式字符串得到其结果值的类(关键字:公式,Evaluator)★
- C# 动态链接库和异步机制
- 求助_用VS2005编写函数读取Excel文档时的困惑。。。。
- 不解的错误:An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll
- C# 做过想大屏幕显示的(如西客站显示列车信息)请进 求思路
- 求教一个多线程的问题
明白了,模态对话框并不是阻塞了主对话框的线程,模态对话框仍然是主对话框的一部分,只是对用户而言在视觉上改变了主对话框的消息响应形式。
”定时器<>线程“这里说下我对这句话的理解看对不对:
加了一个Timer控件并不意味着本程序本身增加了一个线程,但是Timer的工作原理是由操作系统所控制的另一个线程不停的向本程序发送WM_TIMER来实现的。
加了一个Timer控件并不意味着本程序本身增加了一个线程,但是Timer的工作原理是由操作系统所控制的另一个线程不停的向本程序发送WM_TIMER来实现的。你只需要知道,操作系统定时把时间消息发送至你主窗口的消息队列里。
楼主10楼的理解是对的。想详细了解的话可以看看这个http://www.chinaz.com/Program/.NET/1029424D2008.html
应该有帮助。