Даааа, не так все было просто как мне казалось
| Код | public partial class Form1 : Form { ProgressForm _pForm;
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { _pForm = new ProgressForm(); _pForm.Show(); _pForm.StartPBar();
Thread thr = new System.Threading.Thread(ProcessDo); thr.Start(); }
private void ProcessDo() { //for (int i = 0; i < 100; i++) //{ // DataRow NewDataRow = dataSet11.first.NewRow(); // dataSet11.first.Rows.Add(NewDataRow); //} //sqLiteDataAdapter1.Update(dataSet11, "first"); //dataSet11.AcceptChanges();
long j = 10;
for (long i = 0; i < 2000000000; i++) { j += i; j -= i; }
EndJob(); }
private void EndJob() { this.Invoke(new MethodInvoker(delegate() { _pForm.Close(); _pForm.Dispose();
MessageBox.Show("Job is done"); })); } }
public class ProgressForm : Form { ProgressBar _progressBar; Thread _thread;
public ProgressForm() { _progressBar = new ProgressBar(); this.SuspendLayout();
_progressBar.Dock = DockStyle.Fill;
this.ClientSize = new System.Drawing.Size(200, 20); this.Controls.Add(_progressBar); this.Name = "ProgressForm"; this.Text = "Processing, please wait"; this.FormClosing += new FormClosingEventHandler(ProgressForm_FormClosing);
this.ResumeLayout(false); }
public void StartPBar() { _thread = new System.Threading.Thread(ProcessPBar); _thread.Priority = ThreadPriority.AboveNormal; _thread.Start(); }
private void ProcessPBar() { try { while (true) { IncreasePBar();
Thread.Sleep(100); } } catch (ThreadAbortException) {/* Просто способ завершения потока */} }
public void IncreasePBar() { this.Invoke(new MethodInvoker(delegate() { if (_progressBar.Value >= _progressBar.Maximum) _progressBar.Value = 0; _progressBar.Value++; })); }
void ProgressForm_FormClosing(object sender, FormClosingEventArgs e) { // Закрываем поток _thread.Abort(); _thread.Join(); } }
|
Я бы не делал отдельную форму для прогрессбара, а поместил бы его в строку состояния, например.
P.S. Приму любые замечания по коду. |