Variable im Register verändern
-
siecpp schrieb:
Threads machen bei deiner Lösung keinen Sinn. Threads sind dazu da, Dinge parallel zu machen. So wie du das gemacht hast, läuft aber immer nur ein Thread. Was soll das bringen?
Ich denke Threads könnten durchaus nützlich sein bei dem was du machen möchtest aber nicht bei dem was du machst
Der Punkt ist, dass deim Programm kein Multithreading macht.Okay, jetzt wohl nicht mehr, da hast du recht. Ich hatte vorher in der main die Abfrage der Werte in einer endlos-while-Schleife und wollte gleichzeitig einen Wert ändern der in dieser Schleife genutzt wurde, deshalb hatte ich mich fürs (damals war es noch ein) Multithreading entschieden. Gestern habe ich dann die Endlosschleife abgeändert in eine zeitlich begrenzte Abfrage, seitdem ist mein Programm wohl kein Multithreading Programm mehr.

Mittlerweile klappt alles, also auch die Verzögerung habe ich gerade hinbekommen. Ich programmiere meistens einfach so drauf los, obwohl mir hier schon vorher bewusst war was ich erreichen möchte. Trotzdem bin ich wohl eher der Try-and-Error Typ. Ich programmiere aber auch noch nicht sehr lange.
Das einzige Problem dass ich jetzt noch habe ist die Ausgabe. Die will einfach nicht klappen. Momentan möchte ich die Werte ja einfach nur mal angezeigt bekommen, aber durch diese ständigen Abfragen musste ich ja ein
system ("cls");einbauen, sonst könnte man ja gar nichts mehr sehen. Allerdings gibt er mir jetzt nicht die veränderten Werte aus. Weißt du wpran das liegen könnte?
-
laura84 schrieb:
Allerdings gibt er mir jetzt nicht die veränderten Werte aus. Weißt du wpran das liegen könnte?
meinst du diese stelle im code?
printf (" "); printf ("%+.1f ", aend[j]);Wird da garnichts ausgegeben oder nur nicht das, was du möchtest? Was sagt der Debugger? Wesshalb benutzt du printf und nicht cout?
-
Ja genau die Stelle meinte ich, allerdings hab ich die erste Zeile jetzt weg gelassen, weil sie mittlerweile überflüssig ist. Außerdem hab ich herausgefunden dass es mir kurz ausgegeben wird, aber dann durch den "cls" Befehl gleich wieder gelöscht wird.
siecpp schrieb:
Wesshalb benutzt du printf und nicht cout?
Naja um ehrlich zu sein weil ich nicht wüsste wie ich sonst diese Zeilen ausgeben könnte:
printf ("Joystick is \"%s\"\n\n", js->getName());printf ("%+.1f ", ax[j]);Also das Begrenzen der float Variablen geht wohl irgendwie mit
setprecisionaber das geht bei mir irgendwie nicht, da gibt er dann mal keine Nachkommastelle an oder auch mal zwei, wie er gerade will. Deshalb nutze ich printf.
Mittlerweile ist mir noch aufgefallen, dass die Verzögerung jetzt wohl klappt, aber nur beim ersten mal Joystick bewegen und wenn ich dann wieder auf Null gehe ruft er mir nie wieder den Thread auf, egal wie ich den Joystick bewege. Außerdem wird immer nur eine Achse beachtet, wenn ich gleichzeitig nach oben und nach rechts drücke nimmt er nur die Achse die zuerst btätigt wurde.
Ich poste jetzt nochmal meinen Code, weil ich den jetzt nochmal abgeändert hab, vielleicht kannst du mir ja doch noch irgendwie helfen auch wenns total unübersichtlich ist.
#define WIN32_LEAN_AND_MEAN #include <js.h> #include <windows.h> #include <stdio.h> #include <windowsx.h> #include <stdlib.h> #include <iostream> using namespace std; CRITICAL_SECTION csQueueInAccess; #define MAX_THREADS 3 jsJoystick *js; float *ax; int count = 0; int count2 = 0; int count3 = 0; int count4 = 0; int index = 0; float aend[3]; float ausg[3]; int b; int j; DWORD WINAPI ThreadFunc(LPVOID data) { EnterCriticalSection(&csQueueInAccess); while (0.05 < ax[j] || ax[j] < -0.05) { count4 = count3 + 1; Sleep(1000); while (count4>count3 && (0.05 < ax[j] || ax[j] < -0.05)) { aend[j] = ax[j] * 5; ausg[j] += aend[j]; js->read (&b, ax); ax[j] = floorf(ax[j]*100 + .5)/100.; } aend[j] = 0; ausg[j] = 0; } printf ("%+.1f ", ausg[j]); return((DWORD)data); LeaveCriticalSection(&csQueueInAccess); } int main ( int, char ** ) { HANDLE hThread[MAX_THREADS]; DWORD dwThreadID[MAX_THREADS]; InitializeCriticalSection(&csQueueInAccess); jsInit (); js = new jsJoystick (0); if (js->notWorking ()) printf ("Joystick not detected\n"); else printf ("Joystick is \"%s\"\n\n", js->getName()); if (js->notWorking ()) exit (1); ax = new float [js->getNumAxes ()]; count2 = count + 1; Sleep (30); while (count2>count) { printf ("Joystick test program.\n"); printf ("~~~~~~~~~~~~~~~~~~~~~~\n\n"); printf ("+---------JS----------"); printf ("+----------------+\n"); printf ("| Btns "); for (j = 0 ; j < 3 ; j++) printf ("Ax:%d ", j); for ( ; j < 3 ; j++ ) printf (" "); printf ("|"); printf (" Aenderung |\n"); printf ("+---------------------"); printf ("+----------------+\n"); js->read (&b, ax); printf ("| %04x ", b); for (j = 0 ; j < 3 ; j++) { ax[j] = floorf(ax[j]*100 + .5)/100.; printf ("%+.1f ", ax[j]); } printf("| "); for (index = 0; index < 2; index++) { for (j = 0; j < 2; j++) { if (0.05 < ax[j] || ax[j] < -0.05) { hThread[index] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)index, 0, &dwThreadID[index]); WaitForSingleObject(hThread[index], 15); CloseHandle(hThread[index]); } } } system("cls"); } DeleteCriticalSection(&csQueueInAccess); getchar(); return 0; }
-
laura84 schrieb:
Naja um ehrlich zu sein weil ich nicht wüsste wie ich sonst diese Zeilen ausgeben könnte:
printf ("Joystick is \"%s\"\n\n", js->getName());printf ("%+.1f ", ax[j]);cout << "Joystick is \"" << js->getName() << ""\" << endl << endl;cout << setprecision(2) << ax[j];laura84 schrieb:
Mittlerweile ist mir noch aufgefallen, dass die Verzögerung jetzt wohl klappt, aber nur beim ersten mal Joystick bewegen und wenn ich dann wieder auf Null gehe ruft er mir nie wieder den Thread auf, egal wie ich den Joystick bewege. Außerdem wird immer nur eine Achse beachtet, wenn ich gleichzeitig nach oben und nach rechts drücke nimmt er nur die Achse die zuerst btätigt wurde.
Ich blicke da leider immer noch nicht ganz durch. Vielleicht kannst du das mal kommentieren. Was ich aber denke ist, dass du aus den Schleifen nie wieder rauskommst, weil sich die Bedingung wärend der Schleife nicht ändert. Auch das j bleibt immer gleich. Vielleicht ist das der Grund, warum immer nur eine Achse beachtet wird. Ich denke langsam dämmert mir, was du machen möchtest. Du möchtest wahrscheinlich alle Threads parallel laufen lassen, wartest mit dem starten des nächsten Threads aber immer, bis der letzte fertig ist, was nie passiert.
-
Eine zusätzlich Anmerkung: Falls du wirklich alle Threads parallel laufen lassen möchtest, kannst du das natürlich nicht mit der globalen Variable j machen, da diese für alle Threads gleich ist und somit jeder Thread dasselbe machen würde, Du müsstest statdessen jedem thread sein eigenes j als parameter mitgeben.
-
Bei näherem überlegen bin ich mir nicht mehr sicher, ob du Threads parallel laufen lassen möchtest. Vielleicht vergisst du nur, die Werte für ax in der Schleife neu zu lesen. Ich denke das Problem ist, dass ax in der Schleife konstant ist.
Wobei ich sehe gerade. Das machst du schon. Daran kann es nicht liegen.
-
Oh man ich weis es langsam selber nicht mehr. Bin mittlerweile schon total verwirrt und mach immer mehr kaputt als das es besser wird.
cout << setprecision(2) << ax[j];Funktioniert leider nicht so richtig, da ich auch wenn der Wert Null ist gerne "0.0" da stehen haben würde und nicht nur "0". Alle Anderen "fprint" habe ich jetzt aber durch "cout" ersetzt. Danke für den Code.
Also ich frag in den Schleifen schon nochmal neu ab. Das komische ist wenn ich Haltepunkte setze und es dann Schritt für Schritt ablaufen lasse funktioniert es. Zwar nur beim ersten mal Joystick bewegen und auch nur für eine Achse, aber es funktioniert. Wenn ich das Programm ohen Haltepunkte laufen lasse, dann spinnt es total rum und gibt immer irgend einen Schmarrn aus.
Komisch ist auch dass wenn er in die Thread Funktion reinspringt, beim debuggen, dann springt er manchmal einfach so wieder in die main und dann wieder in die Thread Funktion, an irgendeinem Punkt. Das ist wirklich total komisch, denn er hat überhaupt keinen Grund dafür.
Ich verzweifel langsam an diesem Programm!
-
laura84 schrieb:
Oh man ich weis es langsam selber nicht mehr. Bin mittlerweile schon total verwirrt und mach immer mehr kaputt als das es besser wird.
Wenn du es nicht weist wer dann?
Wenn das Konzept falsch oder nicht erkennbar ist, bringt es meistens nichts an einzelnen Codezeilen runzudoktorn. Mach lieber mal ne Pause oder schlaf ne nacht drüber und überlege dir dann nochmal ein Lösungskonzept und skizziere das in pseudocode oder anders.laura84 schrieb:
cout << setprecision(2) << ax[j];Funktioniert leider nicht so richtig, da ich auch wenn der Wert Null ist gerne "0.0" da stehen haben würde und nicht nur "0".
Es funktioniert schon richtig, es mach aber nicht was du möchtest
Es gibt für alles eine Lösung:cout << fixed << setprecision(2) << ax[j];laura84 schrieb:
Das komische ist wenn ich Haltepunkte setze und es dann Schritt für Schritt ablaufen lasse funktioniert es". Zwar nur beim ersten mal Joystick bewegen und auch nur für eine Achse, aber es funktioniert. Wenn ich das Programm ohen Haltepunkte laufen lasse, dann spinnt es total rum und gibt immer irgend einen Schmarrn aus.
Das hört sich nach nem Synchronisationsproblem zwischen den Threads an. Dürfte aber eigentlich nicht sein.
laura84 schrieb:
Komisch ist auch dass wenn er in die Thread Funktion reinspringt, beim debuggen, dann springt er manchmal einfach so wieder in die main und dann wieder in die Thread Funktion, an irgendeinem Punkt. Das ist wirklich total komisch, denn er hat überhaupt keinen Grund dafür.
Womit debuggst du denn? Wird dir angezeigt, dass zwei Threads laufen? Wenn er wieder in die main springt läuft dann der zweite Thread noch?
-
So, ich hab jetzt nochmal 3 Nächte drüber geschlafen.
Ich hab nochmal drüber nachgedacht und alles neu aufgesetzt.Jetzt habe ich also eine Endlosschleife in der ein Thread gestartet wird. Diesem möchte ich eigentlich nur sagen wir mal 30ms geben um dann wieder in die Endlosschleife zurückzukehren. Wie kann ich denn sagen "dir gebe ich immer 30ms"? Er soll eigentlich immer nur die Veränderung anschauen und dann wieder in die Endloschleife zurückkehren damit diese wieder von Vorne beginnen kann. Pro Schleifendutchlauf soll der Thread aber auch einmal gestartet werden, so lange soll dann der main Thread warten (also die 30ms).
Kann mir wer helfen das zu realisieren?
edit: Wieso wird mein Thread in der Endlosschleife eigentlich nur ein einziges mal aufgerufen, wenn ich keine Bedingung zum Aufrufen angegeben habe? Bei jedem weiteren Schleifendurchlauf wird der CreateThread Befehl eifach übergangen.
-
Ich kann dir nicht ganz folgen. Poste mal deinen überarbeiteten Code.
-
So wie mein Code jetzt aussieht hab ich ihn aber schon wieder überarbeitet. Ich bekomme momentan immer ein Access Violation. Außerdem wird der CreateThread Befehl beim debuggen immer erstmal einfach ignoriert und erst nach
fflush (stdout);springt er in den Thread. Das verstehe ich nicht warum er das macht. Sollte ja eigentlich zuerst den Thread abhandeln.
Ich debugge übrigens direkt mit VC++ 6.0#define WIN32_LEAN_AND_MEAN #include <js.h> #include <windows.h> #include <stdio.h> #include <windowsx.h> #include <stdlib.h> #include <iostream> #include <iomanip> using namespace std; CRITICAL_SECTION Section; HANDLE hThread; DWORD dwThreadID; jsJoystick *js; float *ax; DWORD WINAPI ThreadFunc(LPVOID data); int main (int argc, char **argv) { jsInit (); js = new jsJoystick (0); printf ("Joystick test program.\n"); printf ("~~~~~~~~~~~~~~~~~~~~~~\n\n"); if (js->notWorking ()) printf ("Joystick not detected\n"); else printf ("Joystick is \"%s\"\n\n", js->getName()); if (js->notWorking ()) exit (1); ax = new float [js->getNumAxes ()]; int j; printf ("+---------JS----------+----------------"); printf ("+\n"); printf ("| Btns "); for (j = 0 ; j < 3 ; j++) printf ("Ax:%d ", j); cout << "| Aenderung "; printf ("|\n"); printf ("+---------------------+----------------"); printf ("+\n"); while (1) { int b; int index = 0; js->read (&b, ax); printf ("| %04x ", b); for (j = 0 ; j < 3 ; j++) printf ("%+.1f ", ax[j]); InitializeCriticalSection(&Section); hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID)index, 0, &dwThreadID); WaitForSingleObject(hThread, 100); DeleteCriticalSection(&Section); printf ("|\r"); fflush (stdout); #ifdef WIN32 Sleep (1); #elif defined(sgi) sginap (1); #else usleep (1000); #endif } getchar(); return 0; } DWORD WINAPI ThreadFunc(LPVOID data) { int j; float aend[3] = {0, 0, 0}; float ausg[3] = {0, 0, 0}; cout << "| "; EnterCriticalSection(&Section); for (j = 0; j < 3; j++) printf ("%+.1f ", ausg[j]); for (j = 0; j < 3; j++) { while (0.01 < ax[j] || ax[j] < -0.01) { aend[j] = ax[j] * 5; ausg[j] += aend[j]; Sleep(1000); printf ("%+.1f ", ausg[j]); } } LeaveCriticalSection(&Section); return((DWORD)data); }
-
Ah, das mit dem Access Violation lag wohl daran dass ich dem Thread zu wenig Zeit gegeben habe. Hab jetzt auf 500ms raufgeschraubt und dann klappt das auch wunderbar.
-
laura84 schrieb:
Jetzt habe ich also eine Endlosschleife in der ein Thread gestartet wird. Diesem möchte ich eigentlich nur sagen wir mal 30ms geben um dann wieder in die Endlosschleife zurückzukehren.
Weshalb möchtest du das machen? Das ist höchstwarscheinlich keine gute Idee.
laura84 schrieb:
Er soll eigentlich immer nur die Veränderung anschauen und dann wieder in die Endloschleife zurückkehren damit diese wieder von Vorne beginnen kann.
Dann warte doch einfach bis der Thread fertig ist, quasi so ähnlich, wie du es jetzt schon machst. Natürlich kannst du auch die Schleifendurchläufe in der Thradfunktion nach oben begrenzen, falls es das ist was du möchtest.
laura84 schrieb:
Ah, das mit dem Access Violation lag wohl daran dass ich dem Thread zu wenig Zeit gegeben habe. Hab jetzt auf 500ms raufgeschraubt und dann klappt das auch wunderbar.
Wenn du in jedem Fall warte möchtest, bis der Thread fertig ist, nimm INFINITE als Zeit. Dann kannst du auch sicher sein, das immer nur ein Thread läuft und das "hin- und herspringen" entfällt. Du solltest dich vielleicht mal damit vertraut machen, wie multithreading funktioniert und wie man mehrere Threads mit VC++ 6.0 debugged. Ich verstehe noch nicht, wozu du genau die Threads brauchst. Ich denke, das was du machst könnte man auch in einem einzelnen Thread machen und du machst dir das Leben unnötig schwer.
-
siecpp schrieb:
Weshalb möchtest du das machen? Das ist höchstwarscheinlich keine gute Idee.
Dafür sind Threads doch da, oder? Zwei Dinge gleichzeitig zu tun.
siecpp schrieb:
Ich denke, das was du machst könnte man auch in einem einzelnen Thread machen und du machst dir das Leben unnötig schwer.
Das habe ich jetzt letzendlich auch gemacht. Funktioniert auch alles, aber eben relativ langsam. Erst fragt er den eigentlichen Wert ab, dann rechnet er die Veränderungen aus und dann fragt er wieder den Wert ab....
Dadurch geht die Anzeige immer nur sehr stockend voran, das wäre eben mit Threads nicht so gewesen, aber da habe ich das Anzeigen nicht hinbekommen, sonst alles. Und das Anzeigen funktioniert auch nur nicht weil zwischen den Threads immer willkürlich hin und her gesprungen wird, was ich immer noch nicht so ganz verstehe warum das passiert.
-
laura84 schrieb:
siecpp schrieb:
Weshalb möchtest du das machen? Das ist höchstwarscheinlich keine gute Idee.
Dafür sind Threads doch da, oder? Zwei Dinge gleichzeitig zu tun.
Mit meiner Aussage meinte ich, dass es keine gute Idee ist, einen Thread quasi von außen "abzuschießen" ohne zu wissen, was der gerade gemacht hat. Wo genau du etwas gleichzeitig machst ist mir auch nicht klar.
laura84 schrieb:
Und das Anzeigen funktioniert auch nur nicht weil zwischen Threads immer willkürlich hin und her gesprungen wird, was ich immer noch nicht so ganz verstehe warum das passiert.
Wann welcher Thread ausgeführt wird bestimmt nur der Scheduler des Betriebssystems (abgesehen davon, dass man einen Thread auch gezielt schlafen legen kann). Wenn die Funktionalität deines Programmes davon abhängt, in welcher Reihenfolge die Threads ausgeführt werden, machst du etwas grundlegendes falsch. In diesem Fall musst du eintsprechende Synchronisierung sicherstellen. Auf der anderen Seite benutzt du bereits einige Funktionen zur Synchronisierung.
Ist dir klar was folgende CodeZelen machen und warum du sie an dieser Stelle benutzt?WaitForSingleObject(hThread, 100); //... EnterCriticalSection(&Section); //.. LeaveCriticalSection(&Section);
-
Dei Access Violation lag übrigend wahrscheinlich daran das du ein
DeleteCriticalSection(&Section);in der Schleife machst. Das macht nicht den geringsten Sinn und führt dazu, dass wennn das
DeleteCriticalSection(&Section);vor dem
LeaveCriticalSection(&Section);ausgefürt wird das Programm abstürzt, weil die Section nicht mehr da ist. So wie du das vorher gemacht hast war das sinnvoller. Ich denke du solltest dir erstmal klar machen was eine critical Section ist und warum du die hier brauchst. Die meisten deiner Probleme haben ihren Ursprung vermutlich darin, dass dein Verständniss von Multithreading und Threadsynchronisation noch sehr lückenhaft ist. Wenn ich etwas Zeit habe werde ich mal einen Link raussuchen, wo das gut beschrieben ist.
-
siecpp schrieb:
Mit meiner Aussage meinte ich, dass es keine gute Idee ist, einen Thread quasi von außen "abzuschießen" ohne zu wissen, was der gerade gemacht hat.
Das habe ich auch schon gelesen und das sehe ich auch ein, aber das mache ich doch gar nicht, oder? Wenn ich ein
WaitForSingleObject(hThread, 1000);ausführe schieße ich den Thread damit doch nicht ab, oder?
siecpp schrieb:
Wenn die Funktionalität deines Programmes davon abhängt, in welcher Reihenfolge die Threads ausgeführt werden, machst du etwas grundlegendes falsch.
Naja, in meinen Threads sind ja auch ein paar "cout" Befehle drin und wenn die einfach völlig wirr hingeschrieben werden, macht das eben keinen Sinn mehr. Das ist ja das Grundlegende Problem. Ich bekomme die Ausgabe ja nur nicht hin weil die Threads ablaufen wie sie wollen, was auch eigentlich kein Problem wäre wenn keine "cout" Befehle drin stehen würden. Verstehst du?
siecpp schrieb:
Ist dir klar was folgende CodeZelen machen und warum du sie an dieser Stelle benutzt?
Ja das ist mir klar. Das mit dem
DeleteCriticalSection(&Section);war natürlich ein blöder Fehler von mir, das hätte ich bemerken müssen.
siecpp schrieb:
Die meisten deiner Probleme haben ihren Ursprung vermutlich darin, dass dein Verständniss von Multithreading und Threadsynchronisation noch sehr lückenhaft ist. Wenn ich etwas Zeit habe werde ich mal einen Link raussuchen, wo das gut beschrieben ist.
Hier auf meinem Schreibtisch liegen 4 dicke Bücher, darunter das von Charles Petzold und ich habe mir auch schon so einiges im Internet zusammen gesucht, aber wenn man etwas schnell erledigen muss, kann man halt nicht unbedingt vorher ein 1000 Seiten langes Buch lesen.
Ich bin einfach ein Quereinsteiger und hab natürlich so gut wie keine Ahnung, aber ich muss mich einfach momentan damit auseinandersetzten und dafür bin ich auch schon gar nicht schlecht. Ich nehme deine Hilfe natürlich gerne an und bin über jeden Link dankbar. Du hast mir bisher schon ganz toll geholfen ich hmöchte mich nur ein bisschen erklären damit du nicht denkst ich nutze hier wen aus. Also auf jeden Fall schonmal - Danke.
-
laura84 schrieb:
siecpp schrieb:
Mit meiner Aussage meinte ich, dass es keine gute Idee ist, einen Thread quasi von außen "abzuschießen" ohne zu wissen, was der gerade gemacht hat.
Das habe ich auch schon gelesen und das sehe ich auch ein, aber das mache ich doch gar nicht, oder?
Ne das machst du nicht. Ich hatte aber
laura84 schrieb:
Diesem möchte ich eigentlich nur sagen wir mal 30ms geben um dann wieder in die Endlosschleife zurückzukehren.
so verstanden, dass du das machen möchtest.
laura84 schrieb:
Wenn ich ein
WaitForSingleObject(hThread, 1000);ausführe schieße ich den Thread damit doch nicht ab, oder?
Ne, damit wartet der main Thread entweder 1000 ms oder bis sich der Thread hThread beendet hat. Ich weiss allerdings nicht was du damit bezwecken möchtest.
laura84 schrieb:
Naja, in meinen Threads sind ja auch ein paar "cout" Befehle drin und wenn die einfach völlig wirr hingeschrieben werden, macht das eben keinen Sinn mehr. Das ist ja das Grundlegende Problem. Ich bekomme die Ausgabe ja nur nicht hin weil die Threads ablaufen wie sie wollen, was auch eigentlich kein Problem wäre wenn keine "cout" Befehle drin stehen würden. Verstehst du?
Ja jetzt habe ich verstanden was du meinst. Die einzelnen Threads dürften sich eigentlich aufgrund der Critical Section nicht in die Quere kommen. Packe mal das erste cout auch in die Critical Section.
Das einzige was jetzt noch sein könnte, ist, dass der main Thread da irgendwie zwischenfunkt. Du könntes z.B. die Ausgabe des main Threads in die selbe critical section legen. Du musst dir allerdings klar machen, dass der massive Einsatzt von critical sections oder ähnlicher Barrierefunktionen den Vorteil von Multithreading zunichte macht. Dein Programm verbringt wahrscheinlich schon so 90% der Zeit in critical sections, was dazu führt, dass alle Threads bis auch einen warten.laura84 schrieb:
Hier auf meinem Schreibtisch liegen 4 dicke Bücher, darunter das von Charles Petzold und ich habe mir auch schon so einiges im Internet zusammen gesucht, aber wenn man etwas schnell erledigen muss, kann man halt nicht unbedingt vorher ein 1000 Seiten langes Buch lesen.
Das ist auch sicher nicht nötig. Das Problem ist, das Multithreading etwas total unintuitives ist. Damit tuen sich viele sehr schwer, was ich sehr stark gemerkt habe, als ich Kleingruppenübungen an der UNI gehalten habe. Das kann man nicht durch ausprobieren lernen sondern nur duch Studium der theoretischen Grundlagen. Für ein einfaches Verständniss ist aber garnich so viel theorie nötig.
laura84 schrieb:
Ich bin einfach ein Quereinsteiger und hab natürlich so gut wie keine Ahnung, aber ich muss mich einfach momentan damit auseinandersetzten und dafür bin ich auch schon gar nicht schlecht.
Das sollte auch keine Kritik sein sondern nur ein gutgemeinter Rat.
laura84 schrieb:
Du hast mir bisher schon ganz toll geholfen ich hmöchte mich nur ein bisschen erklären damit du nicht denkst ich nutze hier wen aus. Also auf jeden Fall schonmal - Danke.
Kein Problem. Ich lasse mir hier auch an anderen Stellen massiv helfen und versuche nur dafür etwas wieder zurückzugeben.
-
So, ich habs jetzt doch noch geschafft das Programm mit Threads aufzubauen.
Ich hab einfach die cout Befehle aus der ThreadFunc rausgenommen und in den main Thread geschoben. Da hätte ich auch echt früher drauf kommen können.
Das Programm ist aber deswegen trotzdem nicht schneller geworden, wie sollte es auch. Da ich ja immer 1 Sekunde warte um den neuen Wert zu addieren geht es ja nicht anders.