Kompiliere mal diesen Slave (threadsafe), und versuche wenns immer noch crasht die Zeilen 11, 25 und 35 auszukommentieren
AddGadgetItem(Log,...
CRC = ...
MD5 = ...
Sonst lass den Slave mal mit Debugger laufen und schau wo der Fehler geworfen wird.
Code: Alles auswählen
; Zeile 1
; ------------------------------------------------------------------------------------
; EasyCluster Slave Demo
; Author: Alexander Aigner
; Threadsafe aktivieren/Debugger deaktivieren
; ------------------------------------------------------------------------------------
Global Log, Jobs
Procedure AddLog(Text.s)
AddGadgetItem(Log, 0, "[" + FormatDate("%hh:%ii:%ss", Date()) + "] " + Text)
EndProcedure
UseJPEGImageDecoder()
#ECluster_IncludePath = "..\Include\Include\"
XIncludeFile "..\Include\Include\ECluster_inc.pbi"
; Initialisieren
ECluster_Init("..\Include\Windows\ECluster.dll")
Procedure CRC_Text(hSlave, Master, JobNumber, Para, *Stream)
Protected *Mem.ECluster_Mem, CRC
*Mem = ECluster_Parameter_GetMem(Para)
CRC = CRC32Fingerprint(*Mem\Mem, *Mem\MemSize-SizeOf(Character))
ECluster_FreeMemory(*Mem\Mem)
ECluster_FreeMemory(*Mem)
ProcedureReturn ECluster_Return_Long(CRC)
EndProcedure
Procedure MD5_Text(hSlave, Master, JobNumber, Para, *Stream)
Protected String.s, MD5.s
String = ECluster_Parameter_GetString(Para)
MD5 = MD5Fingerprint(@String, Len(String))
ProcedureReturn ECluster_Return_String(MD5)
EndProcedure
Procedure GetLogo(hSlave, Master, JobNumber, Para, *Stream)
Protected *Mem, MemSize
MemSize = ?Logo_E-?Logo_S
*Mem = ECluster_AllocateMemory(MemSize)
CopyMemory(?Logo_S, *Mem, MemSize)
ProcedureReturn ECluster_Return_Memory(*Mem, MemSize)
EndProcedure
Procedure Checker(Slave, Master, Job$)
If ECluster_Slave_GetMasterIP(Slave, Master)<>MakeIPAddress(127, 0, 0, 1) ; Nur lokal
ProcedureReturn #False
EndIf
If Job$ = "GetLogo" ; GetLogo gesperrt
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure ECluster_Slave_EventCB(ECluster_Slave, Master, Job$, EventType, UserData)
Select EventType
Case #Event_Master_Connect
AddLog("Connect: Master:" + Str(Master) + " IP: " + IPString(ECluster_Slave_GetMasterIP(ECluster_Slave, Master)))
ECluster_Slave_SetMasterJobAccessCheck(ECluster_Slave, Master, @Checker())
Case #Event_Master_DisConnect
AddLog("Disconnect: Master:" + Str(Master))
Case #Event_Master_Ping
AddLog("Ping: Master:" + Str(Master))
Case #Event_Master_CountJobs
AddLog("Count Jobs: Master:" + Str(Master))
Case #Event_Master_CountWorkers
AddLog("Count Workers: Master:" + Str(Master))
Case #Event_Master_GetJobInfos
AddLog("Ordered Job Info: Master:" + Str(Master))
Case #Event_Master_DoJob
AddLog("Execute Job: Master:" + Str(Master) + " Job: " + Job$)
Case #Event_Slave_BufferUnderrun
AddLog("Error: Buffer Underrun")
EndSelect
If LastJobCount<>ECluster_Slave_CountJobs(ECluster_Slave)
LastJobCount = ECluster_Slave_CountJobs(ECluster_Slave)
SetGadgetText(Jobs, "Ausstehende Jobs: " + Str(LastJobCount))
EndIf
EndProcedure
; Initialisieren
#Port = 444
#Threads = 32
S1 = ECluster_Slave_Init(#Port, #Threads)
If S1
ECluster_Slave_SetCallback(S1, @ECluster_Slave_EventCB(), #Null)
Main = OpenWindow(#PB_Any, 0, 0, 400, 300, "Slave Demo [Port: " + Str(#Port) + " / " + Str(#Threads) + " Worker]", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Log = EditorGadget(#PB_Any, 5, 5, 390, 260, #PB_Editor_ReadOnly)
Pause = ButtonGadget(#PB_Any, 5, 270, 70, 20, "Pause")
Resume = ButtonGadget(#PB_Any, 325, 270, 70, 20, "Resume")
Jobs = TextGadget(#PB_Any, 80, 273, 240, 20, "Ausstehende Jobs: 0", #PB_Text_Center)
DisableGadget(Resume, #True)
; Jobs registrieren
ECluster_Slave_AddJob(S1, "CRC_Text", "CRC Berechnung (1 String Parameter)", @CRC_Text())
ECluster_Slave_AddJob(S1, "MD5_Text", "MD5 Berechnung (1 String Parameter)", @MD5_Text())
ECluster_Slave_AddJob(S1, "GetLogo", "ECluster Logo holen", @GetLogo())
; Alle Daten >= 32 KB packen (Kompression = 9)
ECluster_Slave_SetCompressionOptions(S1, 32*1024, 9)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case Pause ; Pausieren
DisableGadget(Pause, #True)
DisableGadget(Resume, #False)
ECluster_Slave_Pause(S1)
AddLog("Slave Paused")
Case Resume ; Resumen
DisableGadget(Pause, #False)
DisableGadget(Resume, #True)
ECluster_Slave_Resume(S1)
AddLog("Slave Resumed")
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
; Beenden
ECluster_Slave_DeInit(S1)
EndIf
DataSection
Logo_S:
IncludeBinary "ECluster.jpg"
Logo_E:
EndDataSection