Visual C++ (CLI) Threading
Ich benutze Visual C++ 2008 mit CLI. Ich habe ein Formular mit einem Textfeld und einem button, sobald ich den Knopf drücken, ich möchte den folgenden code für die Ausgabe wie folgt:
private:
System::Void button_Click(System::Object^ sender, System::EventArgs^ e) {
Thread ^thr1 = gcnew Thread(gcnew ThreadStart(&Form1::calculate("t1")));
Thread ^thr2 = gcnew Thread(gcnew ThreadStart(&Form1::calculate("t2")));
thr1->Start();
thr2->Start();
}
void calculate(String^ val) {
int j;
for(j=0; j<10; j++)
_txt->AppendText(val + Convert::ToString(j) + "\n");
}
Gewünschte Ausgabe:
t1 0
t2 0
t1 1
t2 1
etc...
Mein code oben funktioniert nicht. Die besagt, dass ich die Stellvertretung erfordert zwei Eingänge an der gcnew Thead Linie. Was mache ich falsch? Auch gibt es einen besseren Weg, dies zu erreichen?
Es ist nicht angemessen, um völlig verändern Sie Ihre Frage. Starten Sie eine neue ein, wenn nötig.
Obwohl die Frage könnte sich geändert haben, Antworten Sie ist immer noch richtig.
Ja...ich konnte nicht feststellen, dass die
Ich sehe, dass Hans wieder zurück auf die ursprüngliche Frage. Aber das update hat
Obwohl die Frage könnte sich geändert haben, Antworten Sie ist immer noch richtig.
Ja...ich konnte nicht feststellen, dass die
_txt->AppendText
war immer noch da.Ich sehe, dass Hans wieder zurück auf die ursprüngliche Frage. Aber das update hat
_txt->Text = ...
die auch gegen die .NET Beschränkung auf den GUI-Zugriff von anderen threads.InformationsquelleAutor Mark Manickaraj | 2011-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde punt auf der compilation Fehler, da C++\CLI ist nicht die gewohnte Sprache für mich. Aber, ich kann hier ein weiteres problem.
Die Sie versuchen, Zugriff auf eine Benutzeroberfläche, die die Kontrolle von einem nicht-UI-thread. Sie können nicht berühren
_txt
in keiner Weise oder form (auch nur beim Lesen einer Eigenschaft) aus einem worker-thread oder einem anderen thread, außer für die Haupt-UI-thread. Was Sie tun können, ist Marschall der Ausführung eines Delegierten wieder auf den UI-thread und aus, die Sie ändern können, dieText
Eigenschaft oder rufen SieAppendText
. Marschall Delegierter auf dem UI-thread verwenden_text->Invoke
.InformationsquelleAutor Brian Gideon
Wenn
Form1::calculate()
ist nicht statisch, Sie müssen das Objekt, das die Funktion ausgeführt werden soll, wahrscheinlichthis
in Ihrem Fall. Sie laufen auch in die Probleme, diecalculate
argument - dieThreadStart
tut, delegieren ist ein parameter, der-weniger.Es gibt ein Beispiel in MSDN Dokumentation für
ThreadStart
das ist wohl einen Blick Wert.Dies ist der Beispielcode von MSDN eine nicht-statische
ThreadStart
delegieren:InformationsquelleAutor Anders Abel