Forum | | | | Tango | Jetzt bin ich mit meinem Latein am Ende. Ich bekomme es einfach nicht hin. Wie kann ich denn Dateien, Bilder, Texte im Hintergrund nachladen? Geht das überhaupt und wenn ja, wie? Mir fehlt einfach der Ansatz dazu.
Alle Versuche die ich gemacht habe legen sämtliche Animationen lahm bis sie geladen sind.
Wie kann man das prinzipiell lösen? |
| | | | |
| | Georg Teles | Tag,
sag mal genau, was Du vor hast, am besten mit einem Beispiel und welche Profanversion Du benutzt. Soweit ich weiss, gibt es eine Hilfedatei bei xProfan bei, such dort zB nach Bildhandle
Ich melde mich später, wenn ich daheim bin.
Servus |
| | | | |
| | Tango | Georg Teles (10.03.2017)
Tag,
sag mal genau, was Du vor hast, am besten mit einem Beispiel und welche Profanversion Du benutzt. Soweit ich weiss, gibt es eine Hilfedatei bei xProfan bei, such dort zB nach Bildhandle
Ich melde mich später, wenn ich daheim bin.
Servus
Hallo Georg,
ich habe große Probleme meine Diashow auf OpenGL-Basis flüssig zu betreiben. Die oGL-Geschichte läuft super und auch so wie ich mir das gedacht habe. Lade ich nun eine Bilderserie oder auch nur ein Bild, stoppt sämtliche Animation und zwar so lange bis das/die Bild(er) geladen sind/ist. Danach klappt alles. Deshalb war meine Überlegung die Bilderserie ebend im Hintergrund in den Speicher zu laden während die Animation im Vordergund schon läuft und etwas Anderes Zeigt als die Bilder.
Ich hänge mal meinen kompletten Wurstel-Test-Code an.
Wen Du den Testest lege mal im Programmverzeichnis die folgenden Ordner an:
X:/Programmverzeichnis/Bilder/1/1.....20.jpg etc.
und einen Ordner namens Sound und packe dort eine mp3 mit "1.mp3" hinein.
Achso: Ich benutze Xprofan 3.1
Var anzahl% = 0
Var position! = 25
Var color! = 0
Declare hfont&, font&
Declare Ende%, die%'Variable für Abbruchbedingung
Declare pos!, rot!'Positions- und RotationsVariablen
Declare textur%, kugel#
Declare texture%[500]
Declare time&
declare r!
'Legt die Fensterform fest
'WindowStyle 64 + 16 'Fenster ohne Rahmen und
Window %MaxX, %MaxY'Fenster an Desktopauflösung anpassen
CLS 0
'Initialisiert OpenGL
oGL("Init", %hWnd, 0, 0, 0, 0)
oGL("BlendMode",1)
'oGL("LoadXPGL", "Linie.xpgl") 'Lädt Linienpunkte aus Datei Linie.xpgl
'oGL("UseXPGL", 1) 'Verwendet diese Linienpunkte
'Legt Lauftschrift fest
hfont& = create("Font", "Courier New", 32, 0, 0, 10, 0)'Lädt Font in Variable hfont&
font& = oGL("OutlineFont", hfont&, 0.3)'Weist hfont& oGL zu
deleteobject hfont&'Zerstört Objekt hfont& wieder, weil es nach Zuweisung nicht mehr benötigt wird
Verzeichnis 1'Liest Bilddaten ein
'Spielt Mukke ab
MIDI("Play", $ProgDir + "Sound\" + "1.mp3", -1)
SetTimer 5'max. 50 Frames /sek.
WhileNot ende%'Wenn keine Abbruchbedingung erkannt wurde, durchlauf des Timers
If IsKey(27)'ist Abbruchbedingung "Escape-Taste" erfüllt, dann
Ende% = 1'setzte Variable Ende% auf 1
EndIf'und beende diese Abfrage
'print "noch ein test"
Case position! < -100 : position! = 25'Wenn Text hinter linkem Bildschirmrand verschwunden dann starte ihn wieder von Vorne
Case color! = 90 : color!=1'Wenn Rotationswinkel 90Grad erreicht, dann auf 0 setzen
OpenGL()'Zeichne derweil OpenGL
EndWhile'Springe zu WhileNot
KillTimer'Beende nach 5ms den Timer oder besser gesagt: Springe nach 5ms wieder zum SetTimer
End
Proc Verzeichnis
Parameters Folder$'Die Parameterübergabe des aktuellen Verzeichnisses
Var counter% = 0 : Var i% = 0'Zählvariablen zum Einlesen der Bilder
Declare Datei$, bild&'Datei und Bildnummer
Declare Pfad$, Bilder$'Pfad des aktuellen Verzeichnisses und Bilddaten in Vaiable speichern
'Bildverzeichnis Initialisieren
Pfad$ = $ProgDir + "Bilder\" + Folder$ + "\"
ChDir Pfad$
Pfad$ = Pfad$ + "*.jpg"
Bilder$ = FindFirst$(Pfad$)
AddFiles bilder$
'sucht nach Bilder und weist Diese der Variable Bilder$ zu
WhileNot %IOResult
bilder$=FindNext$()
addfiles bilder$
inc counter%
EndWhile
'ordnet die geladenen Bilder dem TexturArray zu
whilenot anzahl% = counter%
DATEI$ = ListBoxItem$(anzahl%)
bild& = Create("hsizedPic",-1, Datei$,1280,1024,1)
casenot bild& : continue
texture%[i% + 1] = oGL("getTextureBMP",bild&,1)
deleteObject bild&
inc i%
inc anzahl%
endwhile
EndProc
proc OpenGL
position! = position! - 0.05
color! = color! + 0.05
oGL("Clear")
' oGL("Origin", 0.0, 0.0, -9.0) 'Setzt Position der XPGL-Linien
' oGL("DrawXPGL", 0, 4) 'Zeichnet ebend diese Linien
oGL("Origin", 0, 0, -30)
oGL("Color", cos(color!), sin(color!), 1 - 0.5*cos(color!/30), 1)
oGL("Move", position!, 11.7, 0)
oGL("Print", font&, " DiaShow V1.0 lorem ipsum...........")
'oGL("Fog",3,0,25 + sin(rotation!))
oGL("Origin", 0, 0, -30)
oGL("Color", cos(color!/10), sin(color!/3), 1 - 0.5*cos(color!), 1)
oGL("Move", position!/0.7, -12.2, 0)
oGL("Print", font&, " lorem ipsum ................................................................ ")
'Sprites
'oGL("Origin", -3.4, -0.1, -6.0)
'oGL("Color", 10, 10, 10, 1)
'oGL("Quad", %MaxX, 0.1)
'oGL("Origin", 0, 0, -12)
'oGL("Draw", kugel#)
'oGL("Origin", 0, 0, -6)
' oGL("Origin", 0, -4.5, -18)
' oGL("Draw", kugel#)
if &GetTickCount - time& >= 5000'5 Sekunden sind rum
r! = r! + 1
case r! = anzahl% : r! = 1
time& = &GetTickCount
endif
'Bilder Laden
oGL("Origin", 0, -4, -12)
oGl("color",1,1,1,1)
oGl("move",-5.8, 0, -7.5)
oGL("Rotate", 0, 30, sin(color!))
oGl("push")
oGL("Texture", texture%[r!], 1)
oGL("Quad", 13, 8)
oGl("pop")
oGL("Origin", 0, -4, -12)
oGl("color",1,1,1,1)
oGl("move",5.8, 0, -7.5)
oGL("Rotate", 0, -30+sin(color!)/0.5, cos(color!))
oGl("push")
oGL("Texture", texture%[r!+2], 1)
oGL("Quad", 13, 8)
oGl("pop")
oGL("Show")'Zeigt alle Objekte
EndProc
|
| | | | |
| | Georg Teles | Tag,
wenn Du bereits etwas Anderes anzeigen willst während die Bilder geladen werden, gibt es verschidene Möglichkeiten:
Versuchen kannst Du mit Multiprocessing von XProfan, dass ein paralleler Prozess die Bilder lädt und der primäre die Animation übernimmt. Habe gerade kein Beispiel sry.
Callback Funktion kann man sich auch anschauen, habe leider auch kein Beispiel, muss basteln.
Hab aber was entdeckt: bei der Schleife zwischen SetTimer und KillTimer füge bitte ein WaitInput, so nimmt dein Programm die ganze Prozessorleistung
SetTimer 5'max. 50 Frames /sek.
WhileNot ende%'Wenn keine Abbruchbedingung erkannt wurde, durchlauf des Timers
Waitinput'<- hier
If IsKey(27)'ist Abbruchbedingung "Escape-Taste" erfüllt, dann
Ende% = 1'setzte Variable Ende% auf 1
EndIf'und beende diese Abfrage
'print "noch ein test"
Case position! < -100 : position! = 25'Wenn Text hinter linkem Bildschirmrand verschwunden dann starte ihn wieder von Vorne
Case color! = 90 : color!=1'Wenn Rotationswinkel 90Grad erreicht, dann auf 0 setzen
OpenGL()'Zeichne derweil OpenGL
EndWhile'Springe zu WhileNot
KillTimer'Beende nach 5ms den Timer oder besser gesagt: Springe nach 5ms wieder zum SetTimer
End
|
| | | | |
| | Tango | Hallo auch,
habe grad die Hilfe bemüht. Es schein als wäre da Multiprocessing der richtige Weg. Doch verstehe ich nicht wirklich was man dort von mir will. Aber ich denke, dass ich die LadeProc der Bilder in ein Modul packe, das läuft dann parallel zum Hauptprogramm und ich kann dann die Bilddaten an das Hauptprogramm zur Laufzeit übergeben.
Sehe ich das so richtig?
Verwirrend finde ich da nur die Auzssage bei Multiprocessing und Callback, "Das Programm macht erst weiter, wenn der Prozess beendet ist".
Damit habe ich doch das Gleiche in Grün oder? |
| | | | |
| | Unterthema: Multiprozessing [...] erzeugt. |
| | | | |
|
AntwortenThemenoptionen | 7.063 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |