2012-04-06 7 views
0

Hintergrundarbeiter, Variablen übergeben funktionieren nicht, in meinem Beispiel erkläre ich alles, ich habe nur die Funktionen, die wichtig waren, habe ich die anderen Funktionen aus der Hintergrundarbeiter.BackgroundWorker, kann keine andere Variable als numerische Werte an die Funktion Callback senden

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); 
} 

So wie kann ich tun, um die unordered_map oder ein std :: string (mehr als 1 Argument) senden?

danke im voraus. das würde sehr helfen.

+1

Die RunWorkerAsync() -Methode erfordert ein Argument, das von Object abgeleitet wird. Das funktioniert nicht für eine native C++ - Klasse wie unordered_map, sie werden nicht von Object abgeleitet. Sie müssen eine kleine Referenzklasse für Helper erstellen, die den Zeiger speichert und stattdessen eine Instanz übergibt. –

+0

Oh, und seien Sie vorsichtig mit Zeigern, sie müssen noch gültig sein, wenn der Arbeitsthread gestartet wird. –

+0

Wie könnte ich das tun? Ich dachte darüber nach, FieldGetter und FieldSetter zu benutzen, aber ich weiß nicht, wie ich es benutzen soll, ich habe gesucht, wie es geht, aber keinen Erfolg. Ich bin mir nicht einmal sicher, ob ich das schaffen kann, ich wollte zwei Saiten passieren können, ist das möglich? könnte ich einen Vorschlag haben? Vielen Dank! – Grego

Antwort

0

Diese Zeile:

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

ist nicht legal, auch in Standard C++. Ein Zeiger muss eine Adresse speichern, kein Objekt. Wahrscheinlich wollten Sie also new sagen, um die dynamische Zuweisung zu verwenden (schließlich muss das Objekt überleben, bis der Callback auf dem anderen Thread ausgeführt wird).

An diesem Punkt können Sie den Zeiger innerhalb System::IntPtr umschließen, und in dem Rückruf das Ergebnis von ToPointer() umwandeln.