0

バックグラウンドワーカー、変数の受け渡しが機能していません。私の例ではすべてを説明しています。重要な関数のみを配置し、BackgroundWorker の他の関数を持っています。

int TheFunction(unordered_map<std::string,std::string> options, BackgroundWorker^ worker, DoWorkEventArgs ^ e){

    if(options["option1"].compare("options") == 0){
            //...
        }

        return 0;
}

    void backgroundWorker2_DoWork(Object^ sender, DoWorkEventArgs^ e ){
         BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);     
        //e->Result = TheFunction( safe_cast<Int32>(e->Argument), worker, e ); //That's how I do to send an integer value and works just fine, but I don't know how to send non-numeric values with safe_cast or something that works, in the function it looks like this: TheFunction(int index, ...) it works fine, I want to know with unordered_map or with strings also would work, I want more than one argument if you can do with std::string
          e->Result = TheFunction(safe_cast<unordered_map<std::string,std::string>>(e->Argument)); //I tried this, and it didn't work

    }


void CallBackgroundWorker(){
         this->backgroundWorker2 = gcnew System::ComponentModel::BackgroundWorker;
         this->backgroundWorker2->WorkerReportsProgress = true;
         this->backgroundWorker2->WorkerSupportsCancellation = true;
         this->backgroundWorker2->DoWork += gcnew DoWorkEventHandler( this, &GUISystem::backgroundWorker2_DoWork );
         this->backgroundWorker2->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler( this, &GUISystem::backgroundWorker2_RunWorkerCompleted );
         this->backgroundWorker2->ProgressChanged += gcnew ProgressChangedEventHandler( this, &GUISystem::backgroundWorker2_ProgressChanged );


         unordered_map<std::string,std::string>* options = unordered_map<std::string,std::string>();
         options["option1"] = "valor1";
         options["option2"] = "valor2";

         this->backgroundWorker2->RunWorkerAsync(options);
}

unordered_map または std::string (複数の引数) を送信するにはどうすればよいですか?

前もって感謝します。それは大いに役立ちます。

4

1 に答える 1

0

この行:

unordered_map<std::string,std::string>* options = unordered_map<std::string,std::string>();

標準の C++ でも合法ではありません。ポインターは、オブジェクトではなくアドレスを格納する必要があります。したがって、おそらく動的割り当てを使用すると言いたかったのでしょうnew(結局のところ、コールバックが他のスレッドで実行されるまで、オブジェクトは存続する必要があります)。

その時点で、ポインタを 内System::IntPtrにラップし、コールバックで の結果をキャストできますToPointer()

于 2012-04-07T13:18:10.210 に答える