System::Threading::Thread ^ Thread erstellen
-
Hi leute,
mir ist nicht ganz klar wo das Problem liegt.
... Threading::Thread ^Scann = gcnew Threading::Thread(); }
1>d:\programmierung\...mainForm.h(149) : error C2512: 'System::Threading::Thread::Thread': Kein geeigneter Standardkonstruktor verfügbar
... Threading::Thread ^Scann = gcnew Threading::Thread(testThread()); } int testThread(void) { return 0; }
1>d:\programmierung\...mainForm.h(149) : error C2664: 'System::Threading::Thread::Thread(System::Threading::ThreadStart ^)': Konvertierung des Parameters 1 von 'int' in 'System::Threading::ThreadStart ^' nicht möglich
-
http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx
dort findest Du ein Beispiel für C++/CLI
-
Was ist jetzt wenn ich den einen und den selben Thread mehrmals gleichzeitig ausführen möchte, also mehre kopien?
Muss ich dann für jede Kopie einen neuen Threading::Thread mit gcnew erstellen und wie beim ersten auf den zugehöhrign Thread Process verweissen? Oder kann ich den ersten immer wiederverwenden und es wird dann da was mit HashCode handgehabt zur Identifikation jeder gestarteten kopie?
-
Einfach neue Instanz erstellen mit gcnew.
Simon
-
Also der ThreadProzess Block (auf den verwiesen wird) ist im Prinzip die ganze zu erledigende Arbeit. Da aber in der Arbeit immer wieder systematische warte sequenzen sind, möchte ich die Arbeit aufteilen damit die verfügbaren Leitungen (je eine warte sequenz) voll ausgenutzt werden.
Nun besteht die Arbeit aber aus einem komplexen zähler ablauf, das heißt ich müsste die Summe von Null bis Zähler ende, durch die Anzahl der gestarteten Thread kopien teilen. Und jedem gestarteten Thread übergeben an welcher stelle er im Zähler beginnt und an welcher stelle er wieder aufhöhrt.
Wie ist das übergeben von Übergabeparametern unter einer Thread Instanzierung möglich?
-
-
theta schrieb:
So:
http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspxDanke - wen ich das früher gewusst hätte...
Und gibt es jetzt auch eine möglichkeit einem ThreadProzess Block etwas zurückgeben zu lassen?So
static int testThreadProcess(int varTest) {
?
-
Könntest Du mich mal kurz aufklären was Du unter ThreadProzess Block verstehst?
Noch ein paar Anmerkungen:
1. Die Thread Funktion (Methode) muss in .NET nicht statisch sein (natürlich kann sie dass).
2. Um Parameter und Rückgabewert aus einer Thread Funktion zu realisieren, kannst Du einfach die Parameter und Rückgabewert in einer Klasse oder Struct kapseln.Simon
-
theta schrieb:
Könntest Du mich mal kurz aufklären was Du unter ThreadProzess Block verstehst?
Noch ein paar Anmerkungen:
1. Die Thread Funktion (Methode) muss in .NET nicht statisch sein (natürlich kann sie dass).
2. Um Parameter und Rückgabewert aus einer Thread Funktion zu realisieren, kannst Du einfach die Parameter und Rückgabewert in einer Klasse oder Struct kapseln.Simon
Naja mit ThreadProcess Block meinte ich den bereich der wie eine normale Function aufgebaut ist, der erst dann als thread gilt wenn eine Thread Instanzierung erstellt wird in der auf die Function verwiesen wird.
Das das irgendwie über eine classe geht habe ich mir schon gedacht aber diese Methode wolte ich als letztere nehmen, wobei da bin ich mir noch nicht sicher - wenn ich dann hunderte Instanzierungen machen muss, macht das erst recht sinn.
-
Hunderte von Threads sind nie (selten) gut.
Einerseits hast Du ja doch nur "wenige" CPU / Cores die arbeiten können und andererseits sind Threads recht Resourcen intensiv.Simon
-
Diese Threads sind praktisch rechenarm, eher lecherlich, es geht eh darum das sie nur TCP/IP anruf machen, auf die Antwort warten und die Antwort aufschreiben. Das ist wirklich nicht viel.
-
Warum benutzt Du nicht das APM (Asynchronious Programming Model) von .NET?
Das benutzt nämlich Threads aus dem ThreadPool, was definitiv sinnvoller ist sobald viele Verbindungen offen sind.Simon
-
Also bei ParameterizedThreadStart kann ich ja nur etwas übergeben was dem Datentyp System::Object entspricht. Wie mache ich das dann, wenn ich eine int übergeben wil? Die int in Object wandeln und dann in der Zielfunction wieder in int konvertieren? Wie geht das?
-
Guck dir die Grundlagen an. In .NET ist ALLES von System::Object abgeleitet.
Simon