Darum hab ich eine JobQueue geschrieben die auf beliebig vielen Threads basieren kann. Doch nicht nur für parallele Verarbeitung mehrerer Proceduren ist die JobQueue gut. Serveranwendungen können z.B. den Input der Clients verarbeiten, die Reaktionen (Antworten/Daten senden/usw) auf die JobQueue pushen und ohne Verzögerung wieder weiterarbeiten. (Master - Slave)
Features:
- FirstIn - FirstOut Prinzip: Was zuerst gepusht wird, wird zuerst bearbeitet
- Initialisierbar mit x Threads
- Jobs in 3 Prioritätsklassen teilbar
- Rückgabewerte werden gecached und können später abgerufen werden
- Sehr Perfomat
Die parallele Berechnung ist auf meinen Quad Core ca. 3,8 - 3,9x schneller als die serielle. Ohne Debugger ausfüren, sonst dauert das ewig ^^.
Code: Alles auswählen
XIncludeFile "JobQueue_MultiThread.pbi"
XIncludeFile "HighResTimer.pbi"
Procedure DemoProg(Para)
; Seeeeeeehr Recheneintensive Berechnung
For i = 1 To 1000000
For j = 1 To 1000
Para + j/i
Next
Next
ProcedureReturn Para
EndProcedure
#RealTimeTest = 0 ; Für Echtzeittest auf 1 setzen. ACHTUNG: Möglicherweise reagiert der PC einige Sekunden lang nicht mehr.
; Parallele Berechnung
t = GetTimeMS()
Jobs = JobQueue_Init(4) ; Initialisierung mit 4 Threads (Quad Core)
If #RealTimeTest ; Echtzeit Test
Job1 = JobQueue_Add(Jobs, @DemoProg(), 1, #Job_RealTimePriority)
Job2 = JobQueue_Add(Jobs, @DemoProg(), 23, #Job_RealTimePriority)
Job3 = JobQueue_Add(Jobs, @DemoProg(), 45, #Job_RealTimePriority)
Job4 = JobQueue_Add(Jobs, @DemoProg(), 67, #Job_RealTimePriority)
Else ; Normale Priorität
Job1 = JobQueue_Add(Jobs, @DemoProg(), 1)
Job2 = JobQueue_Add(Jobs, @DemoProg(), 23)
Job3 = JobQueue_Add(Jobs, @DemoProg(), 45)
Job4 = JobQueue_Add(Jobs, @DemoProg(), 67)
EndIf
While JobQueue_Count(Jobs)
Delay(1)
Wend
Result1_1 = JobQueue_JobReturnValue(Jobs, Job1)
Result1_2 = JobQueue_JobReturnValue(Jobs, Job2)
Result1_3 = JobQueue_JobReturnValue(Jobs, Job3)
Result1_4 = JobQueue_JobReturnValue(Jobs, Job4)
; Ein bisschen Statistik
Worker_1 = JobQueue_JobWorker(Jobs, Job1)
Worker_2 = JobQueue_JobWorker(Jobs, Job2)
Worker_3 = JobQueue_JobWorker(Jobs, Job3)
Worker_4 = JobQueue_JobWorker(Jobs, Job4)
JobQueue_Free(Jobs)
t1 = GetTimeMS()-t
; Serielle Berechnung
t = GetTimeMS()
Result2_1 = DemoProg(1)
Result2_2 = DemoProg(23)
Result2_3 = DemoProg(45)
Result2_4 = DemoProg(67)
t2 = GetTimeMS()-t
; Auswertung
msg.s = "Parallel: " + Str(t1) + " ms" + Chr(13)
msg + "Result1: " + Str(Result1_1) + " ,Worker Thread: " + Str(Worker_1) + Chr(13)
msg + "Result2: " + Str(Result1_2) + " ,Worker Thread: " + Str(Worker_2) + Chr(13)
msg + "Result3: " + Str(Result1_3) + " ,Worker Thread: " + Str(Worker_3) + Chr(13)
msg + "Result4: " + Str(Result1_4) + " ,Worker Thread: " + Str(Worker_4) + Chr(13)
msg + Chr(13) + "Seriell: " + Str(t2) + " ms" + Chr(13)
msg + "Result1: " + Str(Result2_1) + Chr(13)
msg + "Result2: " + Str(Result2_2) + Chr(13)
msg + "Result3: " + Str(Result2_3) + Chr(13)
msg + "Result4: " + Str(Result2_4) + Chr(13)
msg + Chr(13) + "Parallel: " + StrF(t2/t1, 2) + "x schneller"
MessageRequester("Test", msg)
http://files.cxalex.bplaced.net/secure. ... thread.zip