Hey
Ich habe zu dem Thema ausführlich Google befragt, und auch einiges hilfreiches gefunen, wo unteranderem geraten wird, dass man sich eine Worker Klasse erstellen soll, was ich dann auch direkt gemacht hab.
Unteranderem erstelle ich ja eine WinForm, welche ja den Main Thread voll ausnutzt, und unteranderen wollte ich mit mehreren Threads eben verhindern, dass bei längeren Berechnungen, usw. die Form weiter beherrschbar bleibt.
Wie gesagt habe ich mir eine Worker Klasse erstellt, was ansich ja auch funktioniert, jedoch benötige ich nicht nur einen weiteren Thread, sondern mehrere.
Nun war meine Überlegung, ob ich an den Konstiktor der Worker Klasse einfach einen Funktionspointer übergebe, welche ich dann in der Worker-Methode Run ind Schleife immer wieder aufrufe, sodass ich mir nicht mehrere Worker Klassen erstellen muss, sondern jeweils immer nur eine Funktion, wo ich dann die Arbeit vollziehen lassen kann.
Hier mal meine Worker Klasse, vielleicht kann mir ja jemand bei der weiteren Vorgehensweise behilflich sein
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading;
namespace ThreadTest { class WorkerThread { private Thread thread; private bool isRunning;
public WorkerThread(int pFunc) { isRunning = true; }
public void StartThread() { if (thread == null || (thread != null && !thread.IsAlive)) { thread = new Thread(new ThreadStart(Run)); thread.Start(); } }
public void StopThread() { isRunning = false; }
public Thread GetThread() { return thread; }
private void Run() { while (isRunning) { Thread.Sleep(20); } } } } |
EDIT:
Zum besseren Verständniss noch etwas Pseydo Code :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms;
namespace ThreadTest { class TestClass { public TestClass() { WorkerThread WThread = new WorkerThread(Pointer auf TestClassRun); }
public void TestClassRun() { } }
class WorkerThread { private Thread thread; private bool isRunning; private int *pFunc;
public WorkerThread(Pointer_auf_eine_Funktion) { pFunc = Pointer_auf_eine_Funktion; isRunning = true; }
public void StartThread() { if (thread == null || (thread != null && !thread.IsAlive)) { thread = new Thread(new ThreadStart(Run)); thread.Start(); } }
public void StopThread() { isRunning = false; }
public Thread GetThread() { return thread; }
private void Run() { while (isRunning) { pFunc(); Thread.Sleep(20); } } } } |