multimolti
Erfahrenes Mitglied
Hallo!
Ich versuche grade folgendes zu realisieren:
-----------------------
Das Programm soll 2x GLEICHZEITIG
würfeln (also Zufallszahl zwischen 1 und 6), die Ergebnisse dann zusammenzählen und abspeichern. Das Ganze läuft einige 1000 mal ab, bis ich eine halbwegs aussagekräftige Verteilung zusammenhabe.
-----------------------
Einfach nur ein Würfelprogramm zu erstellen wäre ja kein Problem, das "gleichzeitig" ist hier jedoch der Schwierigkeitsgrad. Meine Grundidee war:
"stats" ist die Liste, in der die Ergebnisse gespeichert werden. Das auftretende Problem ist folgendes:
In dieser Zeile: "result = threaddiceresults[0] + threaddiceresults[1];".
Wenn ich im Debug-Modus jedoch auf die "threaddiceresults" Variable gehe, kann ich sehen, dass diese die Elemente [0} und [1] enthält. Ich dachte, vielleicht liegt das daran, dass die Exception ausgelöst wird, danach die Threads aber noch ihre Ergebnisse in die Liste "threaddiceresults" schreiben.
Daher habe ich diese while-Schleife direkt nach "resetEvent.Set();" hinzugefügt, damit auf jeden Fall gewartet wird, bis beide Threads fertig sind:
Hat aber nichts geholfen, das Problem besteht weiterhin.
Könnt ihr mir helfen? Wäre super, Danke!!
Ich versuche grade folgendes zu realisieren:
-----------------------
Das Programm soll 2x GLEICHZEITIG
-----------------------
Einfach nur ein Würfelprogramm zu erstellen wäre ja kein Problem, das "gleichzeitig" ist hier jedoch der Schwierigkeitsgrad. Meine Grundidee war:
- Eine Funktion wartet auf ein Signal von außen, würfelt dann und speichert das Ergebnis
- Es werden 2 Threads erstellt, die jeweils die Funktion abarbeiten sollen
- Nach Erstellung der Threads wird kommt das Signal von außen
- Darauf warten, dass beide Threads fertig sind
- Ergebnisse zusammenzählen
C#:
public void Roll(int count)
{
int result = 0;
for (int i = 0; i < count; i++)
{
if (mode == RollMode.Consecutively)
{
result = rand.Next(1, 7) + rand.Next(1, 7);
}
if (mode == RollMode.Simultaneously)
{
threaddiceresults = new List<int>();
resetEvent = new ManualResetEvent(false);
Thread t1 = new Thread(ThreadDicing);
Thread t2 = new Thread(ThreadDicing);
t1.Start();
t2.Start();
resetEvent.Set();
result = threaddiceresults[0] + threaddiceresults[1];
}
stats[result]++;
}
}
private void ThreadDicing()
{
resetEvent.WaitOne();
threaddiceresults.Add(rand.Next(1, 7));
}
Code:
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
Wenn ich im Debug-Modus jedoch auf die "threaddiceresults" Variable gehe, kann ich sehen, dass diese die Elemente [0} und [1] enthält. Ich dachte, vielleicht liegt das daran, dass die Exception ausgelöst wird, danach die Threads aber noch ihre Ergebnisse in die Liste "threaddiceresults" schreiben.
Daher habe ich diese while-Schleife direkt nach "resetEvent.Set();" hinzugefügt, damit auf jeden Fall gewartet wird, bis beide Threads fertig sind:
C#:
while (t1.ThreadState != ThreadState.Stopped && t2.ThreadState != ThreadState.Stopped)
{
Thread.Sleep(1);
}
Könnt ihr mir helfen? Wäre super, Danke!!
Zuletzt bearbeitet: