2

さて、ほとんどの人がこの種の質問を見るとき、彼らは「ああ、デリゲートを使う」と思うことを知っています。さて、私はデリゲートを使用しています。そして、これは彼らと一緒に働くことを拒否するこれまでのところ唯一のコントロールです。また、BackgroundWorkerを使用していません。

System :: Threading :: Threadのラッパークラスを自分で作成しました。これは、それらを頻繁に使用することがわかっているためです。クラスにさまざまなデリゲートイベントを与えて、UIスレッドと対話できるようにしました。私は主にステータスバーのステータスを設定するためだけに使用しています。未使用のプログレスバーもあったので、追加したいと思いました。私はそれに委任を与えました、しかし私がそれを実行するとき、それは悪名高いものでクラッシュします:

System.Windows.Forms.dllで「System.InvalidOperationException」タイプの未処理の例外が発生しました

追加情報:クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール''。

私が知る限り、他のコントロールと同じようにデリゲートを使用しているため、今は混乱しています。これは特別ですか?私はインターネットを広範囲に検索しましたが、C#BackgroundWorkerの質問だけが表示されますが、これは実際には当てはまりません。これが私の代理人のコードです:

代表者:

delegate void               OnThreadProgressUpdateDel(int progress, String^ status);

イベントを保持する変数:

OnThreadProgressUpdateDel^  m_updateProgressEvent;

イベントのバインド方法:

thread->OnThreadProgressUpdate += gcnew ObjectLoadThread::OnThreadProgressUpdateDel(this, &CObjectLoader::ProgressUpdate);

と呼ばれるイベント:

void CObjectLoader::ProgressUpdate(int progress, String^ status)
{
    gGlobal->ProgramProgress->Maximum = 100;
    gGlobal->ProgramProgress->Value = progress; //Crash here...
    gGlobal->SetProgramStatus(status);
}

ここで呼び出されます:

m_updateProgressEvent->Invoke(1, "Loading objects...");

このばかげたToolStripProgressBarの何が特別なのか、更新したくないのです:(

Microsoft Visual C ++ 2008ExpressEditionでのC++CLR、Windowsフォームアプリケーションの使用。

4

3 に答える 3

3

ToolStripProgressBarにはInvokeメソッドがありません。」

あなたは正しいです。ただし、toolStripProgressBar.ProgressBar.InvokeとInvokeRequiredは存在し、期待どおりに機能します。

于 2012-05-18T20:56:44.200 に答える
1

Windowsコントロールは、作成されたのと同じスレッドから変更する必要があります。制御と操作に応じて、MDAまたは例外は発生しませんが、標準に従うのがはるかに最善です。

if(InvokeRequired) control.Invoke();

スレッドとコントロールを扱うときはいつでもパターン。

http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx

于 2012-04-24T21:02:31.560 に答える
0

//以下のコードを使用しますAhmadabbulkmailer.com

SetControlPropertyValue1(ProgressBar2, "value", 67);

  delegate void SetControlValueCallback1(ToolStripProgressBar oControl, string propName, object propValue);
        private void SetControlPropertyValue1(ToolStripProgressBar oControl, string propName, object propValue) {
            if (oControl.GetCurrentParent().InvokeRequired) {
                SetControlValueCallback1 d = new SetControlValueCallback1(SetControlPropertyValue1);
                oControl.GetCurrentParent().Invoke(d, new object[] { oControl, propName, propValue });
            }
            else {

                Type t = oControl.GetType();
                PropertyInfo[] props = t.GetProperties();

                foreach (PropertyInfo p in props) {
                    if (p.Name.ToUpper() == propName.ToUpper()) {
                        p.SetValue(oControl, propValue, null);
                    }
                }
            }
            

        }
于 2014-04-16T15:32:47.847 に答える