线程,进度条如何
本文关键字:线程 | 更新日期: 2023-09-27 18:16:47
我使用XslCompiledTransform
将XML文件转换为HTML。XML文件不是那么短,所以转换很浪费时间。
xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
所以我想使用进度条或(更好的)进度图标(对话框?),而不是绑定到一个窗体。
问题是我有两个表格。第一个表单有一个项目列表和一个按钮,当选中项目并按下按钮时,第二个表单显示(不是模态),XML文件转换并显示在WebBrowser控件中。
在第二形式构造函数中,我调用XslCompiledTransform.Load
,初始化控件,然后调用XslCompiledTransform.Transform()
。
在第二个表单中,我也有按钮在第一个表单列表项之间导航。因此,当我按下'>',然后从第一个形式的下一个元素被选中,和第二个形式的元素被重新加载-例如,一些文本改变和XslCompiledTransform.Transform()被再次调用一个新的XML文件。
那么,如何组织进度条,而第二形式是每次加载?
From 1st Form:
private void OpenSecondForm()
{
if (formTwo == null)
{
formTwo = new FormTwo(this, culture, params);
formTwo .Show();
}
else
{
if (formTwo .IsDisposed)
{
formTwo = new FormTwo(this, culture, params);
formTwo .Show();
}
else
{
formTwo .Reinitialaze(culture, invoice);
}
formTwo .BringToFront();
}
}
public void SelectRow(int moveTo)
{
try
{
/*navigate on list here */
/* ... */
OpenSecondForm();
}
catch (Exception e)
{ MessageBox.Show(e.Message, "ERROR"); }
}
第二形式:
public FormTwo(Form parent, CultureInfo cultr, string params)
{
culture = cultr;
parentForm = parent;
rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
InitializeComponent();
xslTransform = new XslCompiledTransform();
xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);
ReInitialazeAll();
}
internal void Reinitialaze(CultureInfo cultr, string params)
{
culture = cultr;
ReInitialazeAll();
}
private void ReInitialazeAll()
{
SelectDatabaseData();
InitCaptions();
InitForms();
}
private void InitForms()
{
EnableDisableButtons();
webBrowser1.DocumentText = "<HTML><BODY></BODY></HTML>";
FillXmlData();
}
private void FillXmlData()
{
xslTransform.Transform(fi.FullName, TMP_TRANSFORMED_XML_PATH);
webBrowser1.Navigate(TMP_TRANSFORMED_XML_PATH);
}
我试图创建一个线程来执行这些FillXmlData。但是当xml转换时,我的表单仍然无法访问
您需要在单独的线程上运行XML转换(以及任何其他冗长的非ui加载操作)。像这样:
public FormTwo(Form parent, CultureInfo cultr, string params)
{
culture = cultr;
parentForm = parent;
rm = new ResourceManager("MyProject.Resource", typeof(FormOne).Assembly);
InitializeComponent();
// Show the progress bar
this.ProgressBar.Visible = true;
// Load on another thread
Thread loadingThread = new Thread(new ThreadStart(TransformXml));
loadingThread.Start();
}
private void TransformXml()
{
xslTransform = new XslCompiledTransform();
xslTransform.Load(XSL_TRANSFORM_SCHEMA_NAME);
ReInitialazeAll();
}
注意:这假定您的进度条命名为ProgressBar
。
然而,你需要意识到你不能在另一个线程上访问UI元素,所以需要在UI线程上调用ReInitialazeAll()
(它包含一个错别字)。这可以通过以下操作安全地完成:
private void ReInitialazeAll()
{
// Make sure we're running on the UI thread
if (this.InvokeRequired)
{
BeginInvoke(new Action(ReInitialazeAll));
return;
}
// Hide the progress bar
this.ProgressBar.Visible = false;
// ... execute UI-related code
}
这应该给你一个足够好的开始,你可以从。