Seite 2 von 2

Verfasst: 24.02.2009 01:13
von HeX0R
Ist ja schön, dass du an den Parameter bei der Thread-Prozedur gedacht hast, aber AttachProcess() und DetachProcess() benötigen auch einen.

Dann geht es auch...

Verfasst: 24.02.2009 01:19
von Blackskyliner
Danke. :allright:

Jetzt funktioniert alles, da kann ich mich ja endlich ransetzen und auch was damit umsetzen. Muss mir unbedingt merken das so ziemlich alles einen ersten Parameter hat xD.


<) <) <) <)

Verfasst: 24.02.2009 01:19
von ts-soft
Blackskyliner hat geschrieben:Ahh, ok dachte nur, da Zeiger ja eine Adresse sind dass man die halt als .l machen muss da eine Adresse ja Als Zahl wiedergespiegelt wird. K.A. wo ich diese Art und weise her hab, irgendwo mal aufgeschnappt. Klappt irgendwie trotzdem nicht :( Immernoch Memory Access Error
pointer (zeiger, speicheradressen) sind niemals von einem nativen PB Typ
(.l, .i, .w, .b, .s, .q)!

richtig:
*zeiger

auch richtig:
*zeiger.integer
(dies ist kein nativer Typ, sondern lediglich eine Strukture, die den Zugriff
vereinfacht)

falsch:
*zeiger.l
*zeiger.i

usw.

Verfasst: 24.02.2009 02:21
von Blackskyliner
Ich wollte bloß mal noch meinen Fortschritt hier posten und Fragen was man an dem internen Handling der einzelnen Module verändern oder gar verbessern könnte...

Das Script nutzt die EasyVent Funktionen von purecoder.net

Code: Alles auswählen

XIncludeFile "EasyVENT.pbi"

Define w.l, wev.l

Global moduleDirectory$ = "./modules/";

Structure loadedModules_struct
	id.l
	name.s
	isLoaded.b
	shouldLoaded.b
EndStructure

Global NewList loadedModules.loadedModules_struct();

w = OpenWindow(0,0,0,300,300,"ModuleLoader v0.2 Beta", #PB_Window_SizeGadget | #PB_Window_SystemMenu)
If w
	If CreateGadgetList(WindowID(0));
		TreeGadget(0,0,0,0,0)
		ListIconGadget(1,0,0,0,0,"Module", 100, #PB_ListIcon_CheckBoxes)
	Else
		End
	EndIf
Else
	End
EndIf

Procedure resizeGadgets(*sender.PB_Sender = #Null)
	ResizeGadget(0,0,0,WindowWidth(0)/2, WindowHeight(0));
	ResizeGadget(1,WindowWidth(0)/2,0,WindowWidth(0)/2, WindowHeight(0));
EndProcedure
resizeGadgets()

Procedure loadModules()
	Protected id.l
	ForEach loadedModules()
		If loadedModules()\shouldLoaded = #True And loadedModules()\isLoaded = #False
			id = OpenLibrary(#PB_Any, moduleDirectory$+loadedModules()\name)
			loadedModules()\id = id;
			loadedModules()\isLoaded.b = #True;
		EndIf
		
		If loadedModules()\shouldLoaded = #False And loadedModules()\isLoaded = #True
			CloseLibrary(loadedModules()\id)
			loadedModules()\id = #Null;
			loadedModules()\isLoaded.b = #False;
		EndIf
	Next
EndProcedure

Procedure readModules()
	If ExamineDirectory(0, moduleDirectory$, "*.dll")
		While NextDirectoryEntry(0)
			AddElement(loadedModules())
			loadedModules()\id = #Null
			loadedModules()\name = DirectoryEntryName(0);
			loadedModules()\isLoaded.b = #False;
			loadedModules()\shouldLoaded = #False
			
			AddGadgetItem(1, -1, DirectoryEntryName(0))
		Wend
    	FinishDirectory(0)
	EndIf
EndProcedure
readModules()

Procedure checkBoxHandle(*sender.PB_Sender)
	Protected clickedElement.l, clickedName.s, clickedState.l
	clickedElement = *sender\wParam & $FFFF;
	clickedName = GetGadgetItemText(1,clickedElement-1)
	clickedState = *sender\state - 1
	
	ForEach loadedModules()
		If clickedName = loadedModules()\name
			If clickedState = 0
				loadedModules()\shouldLoaded = #True
			Else
				loadedModules()\shouldLoaded = #False
			EndIf
		EndIf
	Next
EndProcedure

Procedure Close(*sender.PB_Sender)
	PerformDefaultWinProcessing(*sender)
  	ProcedureReturn #Event_ReturnDefault
EndProcedure


SetEventHandler(WindowID(0), #OnClose, @Close())
SetEventHandler(WindowID(0), #OnResize, @resizeGadgets())
SetEventHandler(GadgetID(1), #OnItemCheckboxChanging , @checkBoxHandle())



Repeat
	loadModules();
  	wev = WaitWindowEvent()
Until wev = #PB_Event_CloseWindow
End
PS.: Ist nur relativ schnell gemacht, soll aber das Grundsystem bilden und dass sollte nicht grade irgendwie buggy sein und auch nicht grade _der_ Performancekiller. Ich freue mich über jeden Hinweis, der den Loader verbessert :)

Declares für die Funktionen mach ich demnächst noch =)


Und dann noch ne Prinzip frage... gibt es eine möglichkeit, dass ich Daten zwischen den einzelnen Modulen austauschen lassen kann? Ich habe mir gedacht das ich einen MessageStack als Array oder Liste anlege, über den ich dann in einem Repeat Zyklus eine Funktion der Libarys aufrufe, wenn diese denn vorhanden ist. Nur wie kann ich von der Libary aus Daten in den Loader bekommen, zum austausch?? Über eine weitere Funktion, die mir dann ein MessageStack von dem Modul zurückgibt?? Wie würdet ihr es denn regeln?

Ich danke für alle Hinweise, muss auch nicht unbedingt COde sein sondern einfach nur die Theorie. Soll ja auch schlißlich was dabei lernen ;)

MFG
Blackskyliner