Wie thread mit Parametern aufrufen?
-
Hi,
wie kann ich einen thread mit Parametern aufrufen?
Das array "DllOutput" will ich als Parameter dabei übergeben.Nach diversen Versuchen habe ich jetzt das hier:
Form1^ newForm1 = gcnew Form1; Thread^ tbUpdateThread = gcnew Thread( gcnew ParameterizedThreadStart( newForm1, &Form1::TextboxUpdateThreadProcess )); tbUpdateThread->Start(DllOutput);
und die mit dem thread aufzurufende Funktion sieht so aus:
public: void MeineGUI::Form1::TextboxUpdateThreadProcess(array<String^>^ DllOutput)
Der Compiler meldet:
error C3352: "void LinGUI::Form1::TextboxUpdateThreadProcess(cli::array<Type> ^)": Die angegebene Funktion stimmt nicht mit dem Delegattyp "void (System::Object ^)" überein. with [ Type=System::String ^ ]
-
Ändere
MeineGUI::Form1::TextboxUpdateThreadProcess(array<String^>^ DllOutput)
nach
MeineGUI::Form1::TextboxUpdateThreadProcess(Obect ^args) { array<String^>^ DllOutput = (array<String^>^) args; }
-
Danke, das hat geholfen.
(Dir fehlt noch ein "j" bei "Obect" ).Warum kann ich nur ein allgemeines Object statt nem String übergeben?
-
nibbler schrieb:
Warum kann ich nur ein allgemeines Object statt nem String übergeben?
Weil dem nächsten Thread soll vielleicht ein Integer übergeben werden,
einem anderen ein Objekt vom Typ "foo".=> Object ist der kleinste gemeinsame Nenner
-
Wie geht denn das Aufrufen einer Function als thread mit mehr als einem Parameter?
So möchte ich den thread starten:
Thread^ tbUpdateThread = gcnew Thread( gcnew ParameterizedThreadStart( this, &Form1::TextboxUpdateThreadProcess )); tbUpdateThread->Start(DllOutput, path);
Und so sieht die Function aus:
public: void MeineGUI::Form1::TextboxUpdateThreadProcess(Object ^args, String^ path) { array<String^>^ DllOutput = (array<String^>^) args; StringBuilder^ sb = gcnew StringBuilder(); // [..] StreamWriter^ sw = File::CreateText(path); // [..] }
Folgende Fehlermeldungen kommen diesbezüglich:
error C3352: "void MeineGUI::Form1::TextboxUpdateThreadProcess(System::Object ^,System::String ^)": Die angegebene Funktion stimmt nicht mit dem Delegattyp "void (System::Object ^)" überein. error C2661: 'System::Threading::Thread::Start': Keine überladene Funktion akzeptiert 2 Argumente
-
Ob die Threadfunktion mehrere Parameter haben darf,
kann ich dir jetzt auch nicht sagen.Bau im Zweifel eine neue Klasse, mach ein Objekt davon und speicher alles
rein was du im Thread brauchst.
Dann übergibst du das Objekt dem Thread und gut is...
-
Offenbar darf sie nur einen Parameter haben?!?
Hat nicht eine public-Variable außerhalb der den thread aufrufenden Fuktion den gleichen Effekt wie dein Vorschlag mit der neuen Klasse?
Wenn nein, dann bin ich auch für ne Begründung dankbar.Gruß
-
Wenn ich dich richtig verstanden hab, willst du sowas machen:
class foo { int m_threadParam; void methodX() { m_threadParam = 42; thread.start(); } void threadFunction() { doSomething(m_threadParam); } };
Funktioniert natürlich auch (sogar wenn m_threadParam private ist).
Allerdings hab ich ich die Erfahrung machen müssen, dass man
dadurch recht unflexibel wird: was passiert zum Beispiel, wenn der Thread zweimal gestartet wird...
Ausserdem wirds recht schnell unübersichtlich, wenn's mal mehrere Parameter sein sollen.
-
Ja, das Beispiel trifft es.
Der thread wird zwar mehrmals hintereinander gestartet, läuft allerdings nicht lange genug um mehr als einfach aktiv zu sein.
Zwischen den Starts ist genügen Abstand.Zu dem array kommen wohl noch ca zwei Parameter dazu, daher die Frage.
Da ich laut compiler ja nicht mehr als einen Parameter übergeben kann, muss ich das anders lösen.Die Variante mit den public-Variablen in der Klasse geht zwar,
aber sieht irgendwie auch nicht elegant aus.Fällt dir noch eine Alternative dazu ein?
-
So kann man *beliebig* viele Parameter übergeben:
ref class MyThreadArgs { public: int arg1; String ^arg2; array<int> ^arg3; // ... };
Übergeben musst Du dann natürlich eine Instanz von "MyThreadArgs"...