【发布时间】:2020-03-06 18:16:44
【问题描述】:
我有一个文件监视程序,它正在监视目录中的文件更改。 当它发生时,每个文件都在由 FileProcessor 类(带有线程)管理的队列中排队。 我想在 Form1 中的标签中更新 Q 中的文件数(每次更新该数字) 我尝试了几件事,包括:
class FileProcessor : IDisposable
{
private static Form1 frm;
以及稍后在课堂上的电话:
frm.Invoke((MethodInvoker)delegate { frm.button4.Text = Qcounte(); });
我有一个 System.NullReferenceException 因为我不知道如何在 frm 中声明 Form1 :(
这是带有更新标签功能的主窗体:SetQ(string s)
public delegate void ddisplayQ(string q);
public partial class Form1 : Form
{
public static ddisplayQ deldisplayQ;
public Form1()
{
InitializeComponent();
deldisplayQ = new ddisplayQ(this.setQ);
}
private void setQ(string s)
{
button4.Text = s;
}
在 FileProcessor 类上,这是我调用标签更新的方式:
Form1.deldisplayQ.Invoke(Qcounte());
public string Qcounte()
{
return Convert.ToString(fileNamesQueue.Count);
}
Form1.deldisplayQ.Invoke(Qcounte());
这是全班:
class FileProcessor : IDisposable
{
private EventWaitHandle eventWaitHandle = new AutoResetEvent(false);
private Thread worker;
private readonly object locker = new object();
private Queue<string> fileNamesQueue = new Queue<string>();
public static Form1 frm ;
public FileProcessor()
{
worker = new Thread(Work);
worker.Start();
}
public void EnqueueFileName(string FileName)
{
lock (locker) fileNamesQueue.Enqueue(FileName);
eventWaitHandle.Set();
}
private void Work()
{
while (true)
{
string fileName = null;
lock (locker)
if (fileNamesQueue.Count > 0)
{
if (fileName == null) return;
}
if (fileName != null)
{
ProcessFile(fileName);
}
else
{
eventWaitHandle.WaitOne();
}
}
}
private void ProcessFile(string FileName)
{
Globals.getTags(FileName);
Globals.ecritDb(FileName);
}
public string Qcounte()
{
return Convert.ToString(fileNamesQueue.Count);
}
#region IDisposable Members
public void Dispose()
{
EnqueueFileName(null);
worker.Join();
eventWaitHandle.Close();
}
#endregion
}
我的问题是: 在哪里触发 FileProcessor 类中的入队和出队,以便我可以在我的主窗体中看到文件处理的增加和减少? 提前致谢
【问题讨论】:
标签: c#