ProgressForm類別:C#線程和ShowDialog的問題
public partial class ProgressForm : Form
{
public int prc = 0, sz;
MainForm mf;
public ProgressForm(MainForm MF)
{
InitializeComponent();
mf = MF;
sz = 0;
}
public ProgressForm(int mx)
{
InitializeComponent();
sz = mx;
}
public void SetMax(int mx)
{
sz = mx;
}
public void StartProgress()
{
timer1.Enabled = true;
}
public void IncProgress(int prg)
{
prc += prg;
}
private void timer1_Tick(object sender, EventArgs e)
{
double pos = (double)prc/(double)sz * 100;
progressBar.Value = (int)pos;
}
private void ProgressForm_FormClosing(object sender, FormClosingEventArgs e)
{
timer1.Enabled = false;
}
private void cancelBtn_Click(object sender, EventArgs e)
{
mf.isCanceled = true;
this.Close();
}
private void ProgressForm_Shown(object sender, EventArgs e)
{
progressBar.Value = 0;
StartProgress();
}
}
MainForm類:
void DeleteFiles()
{
int x = 0;
int cnt = resultList.Count;
isCanceled = false;
DeleteThreadHandler("beginprogress");
try
{
DeleteThreadHandler("begindelete");
for (int j = 0; j < cnt; j++)
{
if (resultList[x].isChecked)
{
DeleteThreadHandler("progress");
DeleteFile(resultList[x].name, deleteForm.isDeletePermanently);
if (File.Exists(resultList[x].name))
{
DeleteErrorHandler(resultList[x].name);
isError = true;
}
else
resultList.RemoveAt(x);
}
else
++x;
if (isCanceled)
break;
}
}
finally
{
validity(true);
DeleteThreadHandler("enddelete");
}
}
void DeleteErrorHandler(string val)
{
Action action = null;
action =() =>
{
errorReportForm.AddError(val);
};
this.BeginInvoke(action);
}
void DeleteThreadHandler(String title)
{
Action action = null;
if (title == "beginprogress")
{
action =() =>
{
};
}
else
if (title == "begindelete")
{
action =() =>
{
olvVirtual.BeginUpdate();
};
}
else
if (title == "enddelete")
{
action =() =>
{
olvVirtual.VirtualListSize = resultList.Count;
olvVirtual.EndUpdate();
RefreshStatus();
progressForm.Close();
if (isError)
errorReportForm.ShowDialog();
};
}
if (title == "progress")
{
action =() =>
{
progressForm.IncProgress(1);
};
}
this.BeginInvoke(action);
}
private void DeleteBtn_Click(object sender, EventArgs e)
{
int checkedcount = GetCheckedCount();
if (checkedcount == 0)
{
MessageBox.Show("Please mark at least a file first");
return;
}
DialogResult dr = new DialogResult();
if (deleteForm == null)
deleteForm = new DeleteForm();
dr = deleteForm.ShowDialog();
if (dr == DialogResult.OK)
{
//if (progressForm == null)
progressForm = new ProgressForm(this);
progressForm.Text = "Deleting...";
progressForm.SetMax(checkedcount);
if (errorReportForm == null)
errorReportForm = new ErrorReportForm();
errorReportForm.ClearMemo();
isError = false;
Thread t = new Thread(DeleteFiles);
t.Start();
progressForm.ShowDialog();
}
}
在progressForm,有一個進度條&定時器,更新進度每500毫秒。 問題是我仍然可以訪問主窗體,我也嘗試BeginInvoke,但都不工作 任何人都知道什麼是錯的?
感謝
編輯:我發現這個爛攤子的來源,這是其中的DeleteFile使用Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile。用非託管代碼替換它後,它工作正常。
我想回答我們想看到DeleteFiles函數... – 2011-05-25 04:46:55
通過「我仍然可以訪問主窗體」,你的意思是ShowDialog不凍結主窗口?你是否嘗試過沒有穿線?看起來問題在別的地方。 – Euphoric 2011-05-25 04:53:11
從你的問題中你不清楚你想達到什麼。守則的意圖很明確。那就是說,你在展示你的表格之前就開始了線程。所以你仍然可以訪問表單。 – crypted 2011-05-25 05:01:25