インターフェイスの作成には WPF を使用します。そして、私はタスク リストとして ListView を使用します。タスク リストには、FileName、Progress、TaskInfo にバインドされたすべての行の 2 つの列が含まれています。
public class TaskInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public TaskInfo(string fp)
{
FileSystemInfo fsi= new DirectoryInfo(fp);
FileName = fsi.Name;
FilePath = fp;
PbValue = 0;
}
private int pbvalue;
public int PbValue
{
get { return pbvalue; }
set
{
pbvalue = value;
onPropertyChanged("PbValue");
}
}
private string filename;
public string FileName
{
get { return filename;}
set
{
filename = value;
onPropertyChanged("FileName");
}
}
private string filepath;
public string FilePath
{
get { return filepath;}
set
{
filepath = value;
onPropertyChanged("FilePath");
}
}
private void onPropertyChanged(string name)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}
Progress 列には、その値を PbValue にバインドする ProgressBar が含まれています。しかし、なぜかC言語で書かれたDLLを使わなければならない。私が使用する機能は次のとおりです。
WaterErase(char * filepath, int * pbvalue)
私はC#でそれを定義します:
public extern static void WaterErase(string filepath, ref int pbvalue)
マルチタスクを実行するために、スレッドを作成します。
class TaskThread
{
private TaskInfo taskinfo = null; //task information
private Thread thread;
public TaskThread(TaskInfo _taskinfo)
{
taskinfo = _taskinfo;
}
private void run()
{
WaterErase(taskinfo.FilePath, ref taskinfo.PbValue);
}
public void start()
{
if (thread == null)
{
thread = new Thread(run);
thread.Start();
}
}
}
しかし、行:
WaterErase(taskinfo.FilePath, ref taskinfo.PbValue);
問題がある:
プロパティ、インデクサー、または動的メンバー アクセスは、out または ref パラメーターとして渡されない場合があります。
この問題が発生する理由はわかっていますが、この問題を解決して PbValue をリアルタイムで変更するこの機能を実現する方法を教えてください。だから私は直感的に ProgressBar でタスクの進行状況を実行できます