2

インターフェイスの作成には 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 でタスクの進行状況を実行できます

4

2 に答える 2

5

エラーが示すように、それはできません。ただし、そのためにローカル変数を使用できます。

int temp = taskinfo.PbValue;
WaterErase(taskinfo.FilePath, ref temp);
taskinfo.PbValue = temp;
于 2012-05-12T14:31:52.100 に答える
2

それはいけません。ref 値の意味は、「セッター」の意味とは異なります。Action<T>代わりにを渡すことを検討してください。

Action<int> setter = x => ctrl.SomeProp = x;
Something(setter);

それで:

{some loop} {
    ...
    callback(latestValue);
}

でも!また、複数のスレッドとスレッド間の適切な受け渡しを使用しない限り、UI は通常、ループ内で更新されないことに注意してください (上記はそうではありません)。

于 2012-05-12T14:35:02.940 に答える