小弟初学C#,身边也没老师教。。
最近Boss要求用进度条做个记时程序,
但是搜了很多代码看,也没看出什么门道来
希望大家帮忙解决一下吧我都想了三天了程序功能:每隔一秒,进度条走一格,每分钟更改一次时间
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace jdt
{
public partial class Form1 : Form{
private delegate void ThreadInvoke();
private Thread ttt = null;
public Form1(){
InitializeComponent();
} private void button1_Click(object sender, EventArgs e){
this.ttt = new Thread(new ThreadStart(this.setProgress));
this.ttt.Name = "progress";
this.ttt.Start();
this.button1.Enabled = false;
} private void StartProgress(){
int i = 1,nowtime=0;
while (true){
this.progressBar1.Value = i;
this.label1.Text = "已经过去了" + nowtime + "分";
i++;
if (i > 60){
i = 1;
}
Thread.Sleep(1000);
}
} private void setProgress(){
this.Invoke(new ThreadInvoke(this.StartProgress));
}
}
}
最近Boss要求用进度条做个记时程序,
但是搜了很多代码看,也没看出什么门道来
希望大家帮忙解决一下吧我都想了三天了程序功能:每隔一秒,进度条走一格,每分钟更改一次时间
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace jdt
{
public partial class Form1 : Form{
private delegate void ThreadInvoke();
private Thread ttt = null;
public Form1(){
InitializeComponent();
} private void button1_Click(object sender, EventArgs e){
this.ttt = new Thread(new ThreadStart(this.setProgress));
this.ttt.Name = "progress";
this.ttt.Start();
this.button1.Enabled = false;
} private void StartProgress(){
int i = 1,nowtime=0;
while (true){
this.progressBar1.Value = i;
this.label1.Text = "已经过去了" + nowtime + "分";
i++;
if (i > 60){
i = 1;
}
Thread.Sleep(1000);
}
} private void setProgress(){
this.Invoke(new ThreadInvoke(this.StartProgress));
}
}
}
中的变量
int i = 1,nowtime=0;
改为全局的.
后面加上Application.DoEvents();
还有,运行此程序的时候,如果是直接关闭窗口,线程不会自己终止。
请问还有新的解决办法么?
StartProgress实际是在UI线程上跑的
我不会嘛初学者
还是米有老师教的。
书上的和网络上搜索的C#线程资料要么就没用。。要么就看不懂
lz这里的setProgress方法里面,用StartProgress方法创建一个委托,然后把这个委托Send到UI线程
所以,StartProgress方法里面的Thread.Sleep(1000)直接作用于UI线程,导致UI失去响应
那请问我应该怎么做?
另外写一个类专门处理线程吗?
可是我另外写的类要怎么控制UI中的进度条和标签?
C#的机制是不允许非界面线程处理界面元素啊。。
----------
使用delegate 委托就是了
Hint:
//操作UI的应该是哪个线程跑
this.progressBar1.Value = i;
this.label1.Text = "已经过去了" + nowtime + "分";
//
//应该Sleep的是哪个线程
Thread.Sleep(1000);
private void button1_Click(object sender, EventArgs e){
this.ttt = new Thread(new ThreadStart(StartProgress));
this.ttt.Name = "progress";
this.ttt.Start();
this.button1.Enabled = false;
} private void StartProgress(){
int i = 1,nowtime=0;
while (true){
UpdateBar(i);
this.label1.Text = "已经过去了" + nowtime + "分"; //此处类似的使用delegate就是哦,代码自己照着写 i++;
if (i > 60){
i = 1;
}
Thread.Sleep(1000);
}
}
delegate void dUpdateBar(int i);
private void UpdateBar(int i)
{
if(this.progressBar1.invokeRequired)
{
dUpdateBar d=new dUpdateBar();
this.progressBar1.Invoke(UpdateBar,new object[]{i});
}
else
this.progressBar1.value=i;
}
this.ttt = new Thread(new ThreadStart(StartProgress));
this.ttt.Name = "progress";
this.ttt.Start();
this.button1.Enabled = false;
} private void StartProgress(){
int i = 1,nowtime=0;
while (true){
UpdateBar(i);
this.label1.Text = "已经过去了" + nowtime + "分"; //此处类似的使用delegate就是哦,代码自己照着写
i++;
if (i > 60){
i = 1;
}
Thread.Sleep(1000);
}
}
delegate void dUpdateBar(int i);
private void UpdateBar(int i)
{
if(this.progressBar1.invokeRequired)
{
dUpdateBar d=new dUpdateBar();
this.progressBar1.Invoke(UpdateBar,new object[]{i});
}
else
this.progressBar1.value=i;
}
谢谢你的提醒,现在问题已经解决。。
还有一个新问题:
我关闭窗口后会抛出一个异常:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
这是什么东东?如何解决?
有点看不懂。正在查帮助。。嘿嘿