Re: [Programm] Bilder in Threads laden
Verfasst: 31.01.2014 16:26
Läuft. 

Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Da das Dekomprimieren unter PureBasic wegfällt und Thread 3 noch nicht implementiert wurde sieht der Quelltext nun wie folgt aus:Feindflug hat geschrieben:1. Thread -> Lädt Dateien in Serie.
2. Thread -> Dekomprimiert jede schon geladene Datei.
3. Thread -> Erzeugt Imageobjekte und aktualisiert den Ladebalken.
Code: Alles auswählen
Structure MDIWINDOW
ID.i
ImageGadget.i
EndStructure
Structure THREADINFO
Thread.i
FileName$
Image.i
Displayed.i
EndStructure
Global NewList MDIWindows_Main.MDIWINDOW()
Global NewList ThreadInfos.THREADINFO()
Global NewList ImageStack.THREADINFO()
Global ImageStackLock
While ProgramParameter(x)
AddElement(ThreadInfos())
ThreadInfos()\FileName$ = ProgramParameter(x)
x + 1
Wend
Procedure AddImageToStack(*ThreadInfo.THREADINFO)
Define Index
While ImageStackLock
Delay(1)
Wend
If *ThreadInfo
ImageStackLock = #True
Index = ListIndex(ImageStack())
AddElement(ImageStack())
CopyStructure(*ThreadInfo, @ImageStack(), THREADINFO)
If Not Index = #PB_Any
SelectElement(ImageStack(), Index)
EndIf
ImageStackLock = #False
EndIf
EndProcedure
Procedure LoadImages(void)
Define Index
Repeat
If Index < ListSize(ImageStack())
While ImageStackLock
Delay(1)
Wend
ImageStackLock = #True
SelectElement(ImageStack(), Index)
ImageStack()\Image = LoadImage(#PB_Any, ImageStack()\FileName$)
ImageStackLock = #False
Index + 1
EndIf
Delay(1)
ForEver
EndProcedure
CreateThread(@LoadImages(), #Null)
Window_Main_Title$ = "test program for an image-loading pipeline"
Window_Main = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 640, 400, Window_Main_Title$, #PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
MDIGadget_Main = MDIGadget(#PB_Any, 0, 0, 0, 0, 0, 0)
HideWindow(Window_Main, #False)
ForEach ThreadInfos()
AddImageToStack(@ThreadInfos())
Next
Repeat
MenuHeight_Main = 0
ToolBarHeight_Main = 0
If Not ImageStackLock
ImageStackLock = #True
ForEach ImageStack()
If IsImage(ImageStack()\Image)
If Not ImageStack()\Displayed
AddElement(MDIWindows_Main())
MDIWindows_Main()\ID = AddGadgetItem(MDIGadget_Main, #PB_Any, Str(ListIndex(ImageStack())), ImageID(ImageStack()\Image))
MDIWindows_Main()\ImageGadget = ImageGadget(#PB_Any, 0, 0, 600, 300, ImageID(ImageStack()\Image))
ImageStack()\Displayed = #True
EndIf
EndIf
Next
ImageStackLock = #False
EndIf
WindowEvent = WindowEvent()
Select EventWindow()
Case Window_Main
Select WindowEvent
Case #PB_Event_SizeWindow
ResizeGadget(MDIGadget_Main, 0, 0, WindowWidth(Window_Main), WindowHeight(Window_Main))
Case #PB_Event_CloseWindow
End
EndSelect
EndSelect
ForEver