0

以下は私のバックグラウンドワーカースレッドです

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {            
            Thread t1 = new Thread(Thread1);
            t1.Start();
            Thread t2 = new Thread(Thread2);
            t2.Start();
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true;                
            }
        }

Thread1コードは次のとおりです

static void Thread1()
        {
            int nofiles=0;
            int returned = checkforfolderthread(1);
            int startvalue = 0;
            int stopvalue = 5000;
            if (returned == 1)
            {
                nofiles = countfiles();
                startvalue = startvalue + (nofiles - 1) * 1000;
                stopvalue = stopvalue - startvalue;
            }
            repeat(startvalue, stopvalue,1,nofiles-1);

        }

スレッドから呼び出される関数は次のとおりです

static void repeat(int ini, int fin, int threadno, int startadd)
        {
            int i, j;
            for (j = ini; j < ini + fin; j += 1000)
            {
                StringBuilder sb = new StringBuilder();                
                for (i = j; i < j + 1000; i += 100)
                {
                    WebClient wc = new WebClient();
                    string add = System.String.Format("http://www.colourlovers.com/api/colors/new?numResults=100&resultOffset={0}", i);
                    try
                    {
                        string tobeadded = wc.DownloadString(add);                        
                        sb.AppendLine();
                        sb.Append(tobeadded);
                    }

                    catch (Exception)
                    {
                        break;                        
                    }                    
                }                
                string folderpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                string filename = System.String.Format("DownloadPalette\\Thread{0}\\color{1}.xml",threadno,startadd);

                string location = Path.Combine(folderpath, filename);
                File.WriteAllText(location, sb.ToString());
                startadd = startadd + 1;

            }
        }

私がやりたいことは、for i ループが完了するたびにプログレスバーを継続的に更新することです。

しかし、バックグラウンド スレッドで実行されているこの関数からプログレスバーにアクセスできません。

私を助けてください

4

4 に答える 4

0

あなたはこの方法を見逃しています..

// Back on the 'UI' thread so we can update the progress bar
    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // The progress percentage is a property of e
        progressBar1.Value = e.ProgressPercentage;
    }

この参照によると:BackgroundWorkerとProgressBarのデモ

于 2013-07-04T05:25:36.200 に答える
0

ここで説明されているように、invoke を使用する必要があります: http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx

于 2013-07-04T05:25:49.140 に答える
0

プログレスバーの値以上のものを更新する必要がある場合は、メソッドを呼び出して、呼び出しが必要かどうかを確認できます。別のスレッドから UI オブジェクトにアクセスする場合は、invoke が必要です。

private void updateProgress(object sender, int count, int total)
{
    if (base.InvokeRequired)
    {
        base.Invoke(new ProcessCountHandler(this.updateProgress), new object[] { sender, count, total });
    }
    else if (count <= this.progressBar1.Maximum)
    {
        this.progressBar1.Value = count;
        this.CompletedCount.Text = count.ToString("N0") + " of " + total.ToString("N0");
    }
}
于 2013-07-04T05:39:40.500 に答える
0

まず、更新するメソッドを作成しprogressbarます (メイン スレッド GUI で作成します)。

private void UpdateBar()
{
    //your code to update
}

次に、デリゲートを作成し、メソッドを渡します (このコードはメイン スレッド GUI 用でもあります)。

private delegate void UpdateProgressBarDelegate();
private UpdateProgressBarDelegate UpdateProgressBarDelegate_Object;
UpdateProgressBarDelegate_Object = new UpdateProgressBarDelegate(this.UpdateBar);

次のように別のスレッドから更新します。

progressbar.Invoke(UpdateProgressBarDelegate_Object);

ここでは、安全なスレッド呼び出しを使用して GUI スレッドでメソッドを呼び出す を呼び出してdelegate objectいます。UpdateBar

于 2013-07-04T05:35:58.000 に答える