上次去应聘,公司出了一题目.
是一线程问题,
让做一进度条,当打开一介面时,进行加载时出现.由于多线程学的不好,没有答好,请出手出招.
(当加载一特定介面时,一时打不开,请做一进度条,让用户知道正在加载而不是死机.请用C#做答.)
是一线程问题,
让做一进度条,当打开一介面时,进行加载时出现.由于多线程学的不好,没有答好,请出手出招.
(当加载一特定介面时,一时打不开,请做一进度条,让用户知道正在加载而不是死机.请用C#做答.)
做一个带progressBar的界面,把show新界面的load数据写成一个线程类,
线程类要有progressBarForm的引用(或delegate,要不就invoke),
然后thread.start();progressBarForm.showdialog();
在线程方法结束时关闭dialog。
例如带进度条的窗体类为frmProgressBar
声明引用
frmProgressBar objFrm = null;
Thread thread = null;做个方法
ShowProgressBar()
{
objFrm = new frmProgressBar();
objFrm.ShowDialog();
}
需要它显示的时候
thread = new Thread(new ThreadStart(ShowProgressBar));
thread.Start();记得该窗体关闭时一定要确保线程关闭
if (thread.ThreadState == ThreadState.Running)
thread.Abort();最好加Try块,然后在finally块中关闭它
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace 进度条
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(Add));
thread.Start();
} public delegate void ThredTask(); private void Add()
{
Form.CheckForIllegalCrossThreadCalls = false;
for (int m = 0; m < 100000; m++)
{
this.label1.Text = m.ToString();
this.toolStripProgressBar1.Value = m/1000;
}
}
}
}
没用委托,你试一下代码吧,这样做响应.只是不建议这么做!
二、如果加载工作可以报告进度(如中间有循环),一般不开线程,而在循环体内报告进度,处理消息(Application.DoEvents())刷新界面
三、如果加载工作无法报告进度(如打开数据库、连接网络等),可以将该操作放到子线程中执行,完成后使用同步委托向主线程报告;主线程使用定时器更新进度条状态(伪装进度)。
{
base.OnLoad(e); Form2 f = new Form2(); Thread th = new Thread(new ThreadStart(delegate()
{
f.ShowDialog();
}));
th.Start(); //数据加载过程
int j = 0;
for (int i = 0; i < 1000000000; i++)
{
j++;
} th.Abort();
Thread.Sleep(0); if (f.InvokeRequired)
{
Invoke(new MethodInvoker(delegate()
{
f.Close();
}));
}
else
f.Close();
}