Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 09:15

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Jun 30, 2015 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wieso wird bei folgendem Code die Reihenfolge der Abarbeitung vertauschst ?
Wieso kommt der dritte erst zum Schluss ?
Code:
  1. function LoadShaderneu(file) {
  2.  
  3.     function loadByteBuffer(file) {
  4.  
  5.         var reader = new XMLHttpRequest();
  6.         reader.open("GET", file, true); // geht
  7.         reader.responseType = "arraybuffer";
  8.  
  9.         console.log('ich bin der zweite');
  10.  
  11.         reader.onload = function () {
  12.  
  13.             console.log('ich bin der dritte');
  14.  
  15.             var arrayBuffer = reader.response;
  16.         };
  17.         reader.send(null);
  18.     }
  19.  
  20.     console.log('ich bin der erste');
  21.  
  22.     var byteBuffer = loadByteBuffer(file);
  23.  
  24.     console.log('ich bin der vierte');
  25. }
  26.  
  27. function initShaders() {
  28.     LoadShaderneu("shader/monoColor.frag");
  29.  
  30.     console.log("Ich bin der fuenfte");
  31. }
  32.  
  33.  
  34. initShaders();



Ausgabe:
Code:
  1. ich bin der erste (22:12:30:078)
  2.   at public_html/Shader.js:80
  3. ich bin der zweite (22:12:30:080)
  4.   at public_html/Shader.js:69
  5. ich bin der vierte (22:12:30:083)
  6.   at public_html/Shader.js:84
  7. Ich bin der fuenfte (22:12:30:084)
  8.   at public_html/Shader.js:90
  9. ich bin der dritte (22:12:30:168)


Ich habe schon im Java-Script Forum dieses Problem geschildert, nur dort kommen sie nicht zu eine vernümftigen Lösung.
Das einzige das ich dort erkennen konnte, das JS Callback macht.

Vielleicht hat OpenGLer eine gute Idee, wie man vernümftig Daten einlesen kann.
Das mit dem Shader ist nur ein Beispiel, es geht auch um Vertex-Daten, diese werden bei mir auch mit CallBack eingelesen, welches zu Fehler führt.
Vielleicht gibt es ja eine ganze einfache Lösung zum Daten einlesen. :wink:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 30, 2015 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, die Frage nach dem "wieso" hast du ja schon woanders beantwortet bekommen (callback). Jetzt ist meine Gegenfrage: Warum ist das überhaupt ein Problem?

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 30, 2015 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wie soll man z.B. ein Fragment und Vertex-Shader linken, wen die Daten nicht das sind ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 08:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, nicht. Also macht man das später, wenn die Daten da sind. Z.B. in dem Callback (nutze irgendeine Variable um zu tracken, welcher Inhalt bereits da ist). Wenn alle Resourcen geladen sind, schiebst du die Daten zu OpenGL und startest du deine Renderfunktion.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 08:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ja an dieser Stelle musst du leider weitere Callbacks machen und den Overhead in kauf nehmen. Umgehen kannst du das nicht, aber du kannst es dir
angenehmer machen. Es gibt beim Programmieren das Konzept des Monad. Dabei handelt es sich vereinfacht gesagt um einen Kontext zum Kombinieren
deiner Funktionsaufrufe. Mal ein einfaches Beispiel aus der MS Welt:

Code:
  1.  
  2. //SharePoint Context erstellen
  3. var clientContext = new SP.ClientContext(siteUrl);
  4. //oList speichert nur die Aufrufe und Argumente
  5. var oList = clientContext.get_web().get_lists().getByTitle('Announcements');
  6. //jetzt sagen wir dem Context das oList gebraucht wird
  7. clientContext.load(oList);
  8. //vielleicht moechte man jetzt noch gerne ein Listenelement haben?
  9. var oItem = oList.getItemById(1);
  10. clientContext.load(oItem);
  11. //bis jetzt sind oList und oItem jeweils nur die Funktionsaufrufe und keine Objekte mit Daten
  12. //also sagen wir dem ClientContext das er jetzt erst einmal unsere Objekte verarbeiten soll
  13. clientContext.executeQueryAsync(function() { //onSuccess
  14.      //Jetzt sind oList und oItem Objekte die du verwenden kannst
  15. },function(){});
  16.  
  17.  


Sieht natuerlich sehr Schick aus, aber im Prinzip ist es ganz einfach:
Code:
  1.  
  2. function Printer(str) {
  3.    this.msg = str;
  4.    this.result = function(self) { throw "error"; }
  5.    this.Execute = function(self) {
  6.       Console.log(self.msg);
  7.       self.result = function(new_self) {
  8.           return "success!";
  9.       }
  10.    }
  11. }
  12.  
  13. function print(str) {
  14.     return new Printer(str);
  15. }
  16.  
  17. function initAsyncObject(obj) {
  18.     obj.Execute(obj);
  19. }
  20.  


Du musst jetzt also nur noch dafuer sorgen das dein Context die "Printer" in der richtigen Reihenfolge durch "initAsyncObject" schickst.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Naja, nicht. Also macht man das später, wenn die Daten da sind. Z.B. in dem Callback (nutze irgendeine Variable um zu tracken, welcher Inhalt bereits da ist).


Dies habe ich versucht, aber er bleibt in der while-Schleife hängen.

Oder gibt es ein Application.ProcessMessages; so wie bei Lazarus/Delphi ?


Code:
  1. var geladen = false;
  2.  
  3. function loadByteBuffer(file) {
  4.  
  5.     var byteBuffer;
  6.  
  7.     var reader = new XMLHttpRequest();
  8.     reader.open("GET", file, true); // geht
  9.  
  10.     reader.onreadystatechange = function () {
  11.  
  12.         console.log('onLoad');
  13.  
  14.         if (reader.readyState == 4) {
  15.             console.log(reader.responseText);
  16.             geladen = true;
  17.         } else {
  18.             console.log('Fehler');
  19.         }
  20.     };
  21.     reader.send();
  22.  
  23. }
  24.  
  25. loadByteBuffer("shader/monoColor.frag");
  26. while (!geladen) {
  27.     console.log('Versuche zu laden');
  28. }
  29.  
  30. console.log('Laden erfolgreich');
  31. geladen = false;
  32.  
  33. // nächster Shader

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 16:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Sowas wie application.processmessages gibt es in JS zum Glück nicht ;)

Ich lade meine Shader auch synchron und auch über einen XMLHttpRequest.

Quellcode : https://github.com/SaschaWillems/webgl/ ... glutils.js

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Code:
  1.   gl.attachShader(shader, vertexShader);
  2.   gl.attachShader(shader, fragmentShader);
  3.   gl.linkProgram(shader);

Bekommst du hier keine Probleme, wen die Daten noch nicht bereit sind ?

Code:
  1. this.getShaderStrFrom.....

Für was ist das Schlüsselwort this bei dieser Zeile gut ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ja bekommt er, weil synchron nicht Standard ist :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Code:
  1.   gl.attachShader(shader, vertexShader);
  2.   gl.attachShader(shader, fragmentShader);
  3.   gl.linkProgram(shader);

Bekommst du hier keine Probleme, wen die Daten noch nicht bereit sind ?

Nein, klappt wunderbar. Lade aber (weils halt nur zum Spielen ist) auch nur lokale Dateien.

mathias hat geschrieben:
Code:
  1. this.getShaderStrFrom.....

Für was ist das Schlüsselwort this bei dieser Zeile gut ?

Überbleibsel, kann eigentlich weg.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
yunharla hat geschrieben:
Ja bekommt er, weil synchron nicht Standard ist :)


Quelle? Es ist in den meisten Browsern deprecated (mit entsprechender Warnung).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Sascha Willems hat geschrieben:
yunharla hat geschrieben:
Ja bekommt er, weil synchron nicht Standard ist :)


Quelle? Es ist in den meisten Browsern deprecated (mit entsprechender Warnung).


kuckst du hier. Auf gut deutsch:
Du musst einen Webworker dafür nehmen, sonst knallts.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jul 01, 2015 19:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich bei
Code:
  1. reader.open("GET", file, false);

false anstelle true schreibe, dann würde die Reihenfolge stimmen.

Nur kommt er dann mir dem arrayBuffer nicht mehr zurecht.
Für den Shader würde dies gehen, da dieser als Text vorliegt,
aber für Vertex's muss eine andere Lösung daher.

Und wie oben schon beschrieben kommt ein Hinweis deprecated.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jul 02, 2015 08:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nun wie gesagt das ist halt die Problematik mit der Document-Environment oder halt UI-Thread. Dieser ist auch wieder ein Monad. Nur dieses mal ist
dein gesamtes Programm eine Funktion die "Welt" als Parameter nimmt und eine aktualisierte Welt zurückgibt. Externe Programme oder Funktionen
können nun diese neue Welt weiterverarbeiten und ggf. dein Programm erneut mit einer weiteren neuen Welt starten.

Der grosse Vorteil dabei ist das du keine Probleme mit irgendwelchen anderen Threads bekommst, wenn du Welt veränderst. Also zum Beispiel wenn
du HTML-Elemente bearbeitest.

Wenn du nun allerdings darauf warten willst das irgendetwas anderes deine Welt verändert hast du ein Problem. Das kann nämlich nur dann passieren
wenn deine Funktion, also das Programm, beendet wurde. Du musst in deiner neuen Welt also irgendetwas reinschreiben das durch die externen
Programme / Funktionen startet und Sie dazu veranlasst dein Programm wieder zu starten. Und genau das sind die Events in Javascript.

Stell dir am besten vor das "World" eine Liste mit Eventnamen+Callback enthält. Sobald nun das Event ausgelöst wurde, wird dein Programm gestartet und
der Callback deine neue "Main" Funktion.

Soweit zu grauen Theorie:

Code:
  1.  
  2. function loadByteBuffer(file,next) { //next ist dein Callback der Ausgefuehrt wird wenn alles fertig ist
  3.  
  4.     var byteBuffer;
  5.  
  6.     var reader = new XMLHttpRequest(); //neue HTTP-Abfrage
  7.     reader.open("GET", file, true); //Parameter fuer die Abfrage
  8.  
  9.     reader.onreadystatechange = function () { //Einen Callback an das Event der Abfrage haengen
  10.         //Dieser Block wird erst ausgefuehrt wenn das Programm erneut startet und diese Funktion als
  11.         //durch das Event als EntryPoint gesetzt wurde.
  12.         console.log('something happened during load');
  13.         if (reader.readyState==4 && reader.status==200) {
  14.             console.log(reader.responseText);
  15.             next(); //auf zum naechsten Schritt
  16.         }
  17.     };
  18.     reader.send(); //du hast jetzt deiner neuen "Welt" eine HTTP-Abfrage hinzugefuegt
  19.     //jetzt kannst du noch deiner Welt zum Beispiel weitere HTTP-Abfrage usw. hinzufuegen
  20. }
  21.  
  22. //alles ausserhalb von Funktion ist Bestandteil der "main" Funktion und ist der erste EntryPoint
  23. console.log('Versuche zu laden');
  24. loadByteBuffer("shader/monoColor.frag", function() {
  25.    console.log('Laden erfolgreich');
  26.    // nächster Shader
  27. });
  28.  
  29.  
  30.  
  31.  


Wenn du nun also nicht staendig neue Callbacks definieren willst. Kannst du einfach per OOP etwas bauen:
Code:
  1.  
  2.  
  3. beginShader().loadByteBuffer("shader/1.frag").loadByteBuffer("shader/2.frag").done(function() {
  4.     //mach sagen mit 1.frag und 2.frag
  5. });
  6.  


"loadByteBuffer" erstellt dann eine Liste mit Parametern und done :
Code:
  1.  
  2. function done(cbk) {
  3. if(list.Length > 0) {
  4.     var entry = list.pop();
  5.     //Requests abfeuern und done beim onReadyState aufrufen
  6. } else {
  7.     //jetzt deine "custom" funktion aufrufen
  8.     cbk();
  9. }
  10. }
  11.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jul 05, 2015 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

um die Ausgangsfrage zu beantworten: http://www.w3schools.com/jsref/event_onload.asp.

Onload-Funktionen werden erst ausgeführt, sobald die komplette Seite geladen wurde.

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.034s | 17 Queries | GZIP : On ]