Fehlermeldung für angebliches endwhile ohne while

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Jo. Alle 1.5 Sekunden, per SetTimerA()-API. Die Callbackfunktion:

      Quellcode

      1. proc TransportCallback
      2. declare cct&,l&
      3. SetText aktfile&,Del$(aktfile$,1,Len($Base+user$))
      4. For l&,0,2
      5. SetText handle&[l&],Str$(status&[l&])
      6. cct&=cct&+status&[l&]
      7. EndFor
      8. SetText handle&[3],Str$(cct&)+"/"+Str$(count&)
      9. SetText handle&[4],ConvertBytes$(1000*asize!/(&GetTickCount-globaltick&),2)+"/s"
      10. endproc
      und eine für Downloads größer als ein bestimmter Wert:

      Quellcode

      1. proc DownloadCallback
      2. Parameters taddr&,saddr&'nicht verändern!
      3. declare quadint transferred,size'Anzahl übertrageneer Byte, Gesamtgröße
      4. Long Addr(size),0=Long(saddr&,0),Long(saddr&,4)
      5. Long Addr(transferred),0=Long(taddr&,0),Long(taddr&,4)
      6. Progressbar("Set",pb2&,Round(100*transferred/size,0))
      7. case Clicked(pause&):Pause
      8. case Clicked(abbr&):globalende%=1
      9. Return globalende%'0=weiter, 1=Abbruch; ohne Return evtl. Abbruch, also immer Return 0, wenns weitergehen soll
      10. endproc
      ist für meine MyFTP.inc nötig.

      Ich hatte es schon mal ohne Callbacks probiert, aber das hat auch nichts gebracht. Könnte ich aber nochmal machen.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • So, ich hab meinen letzten Test für heute beendet. Wieder mit WhileLoop. Wenn nach exakt 54830 Durchläufen die innere Schleife beendet wird und die äußere weiter machen soll kommt am "endwhile" wieder die Fehlermeldung, dass das while fehlt.

      Ich werde morgen weiterforschen...
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Dann versuche ich es nochmals ohne Callbackfunktion.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Tatsächlich. Ohne Callback funktioniert es. Das ist bedauerlich. :-(
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Ich zitiere mal aus der Hilfe zu CallBack-Funktionen:

      "Natürlich kann ProcAddr auch überall verwandt werden, wo die Adresse einer Prozedur benötigt wird. Es ist jedoch zwingend darauf zu achten, dass während des Aufrufs einer Prozedur von außerhalb über ProcAddr das XProfan-Programm nicht weiterläuft, da XProfan derzeit nicht in der Lage ist, zwei Codeteile in einem Prozess parallel aufzurufen. Im obigen Beispiel ist diese Bedingung ja gegeben, da die Prozedur "Fontliste" ja von der API-Funktion "~EnumFontFamilies" aufgerufen wird und erst nach Beendigung der API-Funktion das XProfan-Programm weiterläuft.
      (Wie man mit XProfan mehrere Prozeduren parallel laufen lassen kann, wird im Kapitel "Multiprozessing mit XProfan" gezeigt.)"

      Kurz: In XProfan ist die Routine zum Abarbeiten der Codezeilen leider nicht threadsicher und daher ist Multithreading in XProfan nicht möglich. Sorry.

      Gruß
      Roland
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • RGH schrieb:

      Ich zitiere mal aus der Hilfe zu CallBack-Funktionen:

      "Natürlich kann ProcAddr auch überall verwandt werden, wo die Adresse einer Prozedur benötigt wird. Es ist jedoch zwingend darauf zu achten, dass während des Aufrufs einer Prozedur von außerhalb über ProcAddr das XProfan-Programm nicht weiterläuft, da XProfan derzeit nicht in der Lage ist, zwei Codeteile in einem Prozess parallel aufzurufen. Im obigen Beispiel ist diese Bedingung ja gegeben, da die Prozedur "Fontliste" ja von der API-Funktion "~EnumFontFamilies" aufgerufen wird und erst nach Beendigung der API-Funktion das XProfan-Programm weiterläuft.
      (Wie man mit XProfan mehrere Prozeduren parallel laufen lassen kann, wird im Kapitel "Multiprozessing mit XProfan" gezeigt.)"

      Kurz: In XProfan ist die Routine zum Abarbeiten der Codezeilen leider nicht threadsicher und daher ist Multithreading in XProfan nicht möglich. Sorry.

      Gruß
      Roland
      Autsch, ich bin davon ausgegangen, dass wenn die Callbackfunktion aufgerufen wird, der Rest ruht. So ergibt es natürlich Sinn.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • p. specht schrieb:

      Kann man nicht das ganze File auf einmal ins RAM laden und den Teil mit inc SIZE&, val( danach viel schneller abarbeiten?
      Wie gesagt, der size-Teil ist nicht wirklich wichtig. Ich könnte an den Anfang der Datei eine Art Header setzen, wo der Endwert von size schon drinsteht. Ohne size ist die Schleife aber auch nicht wirklich schneller.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Das Problem scheint jetzt gelöst zu sein. Ich hab alle Callbacks wieder reingenommen, aber komplett ohne Whileloop/For-Schleifen. Da gibts keine Probleme.
      @Roland: Ich weiß nicht wie du Whileloop/For-Schleifen verwaltest, aber vielleicht lässt sich da noch was drehen, dass die in den Callbacks auch immer funktionieren. Interessant wäre noch, ob es funktioniert, wenn ich eine While-Schleife benutze und mich selbst um eine inkrementierende Variable kümmer.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Mal ganz dumm gefragt, vielleicht kann Roland was einbauen, damit man einen oder besser mehrere von XProfan verwalteten Timer erstellen kann, die nach der vorgegebenen Zeit das Programm kurz anhalten und das Callback durchführen...
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Jac de Lad schrieb:

      Das Problem scheint jetzt gelöst zu sein. Ich hab alle Callbacks wieder reingenommen, aber komplett ohne Whileloop/For-Schleifen. Da gibts keine Probleme.
      Ob es Probleme gibt oder nicht, hängt unter anderem vom Zufall ab...
      Ob es bei dir Probleme gibt, kann ich so nicht sagen. Das hängt von deinem Code ab.
      ________________________________________________________

      PPFScanner PPFS Android MisterXMail@web.de
      Mfg AHT
    • AHT schrieb:

      Jac de Lad schrieb:

      Das Problem scheint jetzt gelöst zu sein. Ich hab alle Callbacks wieder reingenommen, aber komplett ohne Whileloop/For-Schleifen. Da gibts keine Probleme.
      Ob es Probleme gibt oder nicht, hängt unter anderem vom Zufall ab...Ob es bei dir Probleme gibt, kann ich so nicht sagen. Das hängt von deinem Code ab.
      Jo. Aber vielleicht lässt sich was in der Verwaltung der Schleifen tun, das das verbessert.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Kleiner Test...

      Spiel mal ein bisschen mit dem Code hier rum. Dann siehst du, was alles nicht geht:
      Mal hier den Dialog über den Menüpunkt Programm und Einstellungen aufrufen - bitte das mehrmals tun:

      Brainfuck-Quellcode

      1. DEF @GetDlgCtrlID(1) !"USER32", "GetDlgCtrlID"
      2. DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1)) = -%MENUITEM
      3. ' Testprogramm Timer
      4. ' Profan Version 9
      5. $H Windows.ph
      6. '-Main----------------------------------------------------------------
      7. Declare Timer_Busy%, Ende%
      8. Declare TimerID&, Create%, T_Text&, Test#
      9. Declare hD%, hA%, hB%, OK%, hTime%
      10. Declare hF1%, hT1%
      11. WindowStyle 26
      12. WindowTitle "Timertest PHU-60"
      13. Window 100,100 - 370,400
      14. cls
      15. 'Let T_TEXT&=@CREATETEXT(%HWND,"",30,30,300,30)
      16. '-Menue---------------------------------------------------------------
      17. PopUp "&Programm"
      18. AppendMenu 108, "&Einstellungen"
      19. AppendMenu 109, "&Ende"
      20. Ende% = 0
      21. ' Timer setzen (2x pro Sekunde, 250ms)
      22. TimerID& = ~SetTimer(%HWND, 333, 100, ProcAddr("Timer", 4))
      23. WhileNot Ende%
      24. WaitInput
      25. If MenuItem(108)
      26. Beep
      27. Einstellungen
      28. If HD% > 0
      29. Destroywindow(HD%)
      30. endif
      31. Endif
      32. If MenuItem(109)
      33. ~KillTimer(%HWND, 333)
      34. Ende% = 1
      35. Endif
      36. 'DestroyWindow(FindWindow("AHT Test-Einstellungen"))
      37. EndWhile
      38. End
      39. '-Proc Einstellungen
      40. Proc Einstellungen
      41. Clear OK%
      42. 'Dialogfenster erzeugen
      43. hD% = Create("Dialog", %hWnd,"AHT Test-Einstellungen", %WinLeft+80, %WinTop+155, 230, 190)
      44. hF1% = Create("Font", "Courier New", 16, 0, 0, 0, 0)
      45. hT1% = Create("Text", hD%, "Einstellungen...", 10, 10, 220, 20)
      46. SetFont hT1%, hF1%
      47. hTime% = Create("TimeEdit", hD%, "00:00:00", 10, 35, 100, 24)
      48. hB% = Create("Button", hD%, "&Nachstellen", 10, 120, 100, 28)
      49. hA% = Create("Button", hD%, "&Abbrechen", 120, 120, 100, 28)
      50. WhileNot Ok%
      51. WaitInput
      52. If ButtonClicked(hB%) ' Nachstellen
      53. Ok% = 1
      54. ' Aktionen hier
      55. ElseIf ButtonClicked(hA%) 'Abbrechen
      56. Ok% = 1
      57. ElseIf (%Key = 2) 'ALT+F4 bzw. schließen
      58. Ok% = 1
      59. EndIf
      60. EndWhile
      61. If HD% > 0
      62. DestroyWindow(hD%)
      63. DeleteObject hF1%
      64. endif
      65. EndProc
      66. '-Prozedur die in bestimmten Zeitintervallen ausgefuehrt wird (4x pro Sekunde)
      67. Proc Timer
      68. Parameters P1&, P2&, P3&, P4&
      69. Timer_Busy% = Timer_Busy% + 1
      70. Locate 1,1
      71. Print "Timer:" + str$(Timer_Busy%) + " Durchläufe"
      72. Locate 2, 1
      73. Print "Handle Dialog: " + STR$(hD%) + " "
      74. Locate 3, 1
      75. Print "Handle Button 'Nachstellen': " + STR$(hB%) + " "
      76. Locate 4, 1
      77. Print "Handle Fomt: " + STR$(hF1%) + " "
      78. Locate 5, 1
      79. Print "Handle Button 'Abbrechen': " + STR$(hA%) + " "
      80. Locate 6, 1
      81. Print "Handle TimeEdit: " + STR$(hTime%) + " "
      82. Locate 7, 1
      83. Print "Handle Text 'Einstellungen': " + STR$(hT1%) + " "
      84. EndProc
      Alles anzeigen
      Wie man da sieht, überschreibt XProfan, wenn wenn der Timer aufgerufen wird, intern Variablen und der Dialog wird zeitweise nicht korrekt erstellt. Ob was überschrieben wird oder nicht was XProfan noch braucht, ist davon abhängig, wo der Timer genau die Codeausführung innerhalb der Create Befehle unterbricht.
      Ob da was schief geht (und wie oft das der Fall ist) ist komplett zufällig und hängt unter anderem auch von dem Rechner ab, auf dem das Programm läuft.. Gerade auf neuen Betriebssystemen fällt es deshalb da sehr schwer, wirklich vernünftig mit der Sprache Anwendungen zu programmieren. Alles was die Programmausführung für einen Callback unterbricht, kannst du im Prinzip mit XProfan nicht sicher durchführen. Das ist natürlich nicht nur die Timerproc, die das betrifft...

      Jac de Lad schrieb:

      Jo. Aber vielleicht lässt sich was in der Verwaltung der Schleifen tun, das das verbessert.
      Eine andere Programmiersprache verbessert das - deswegen bin ich zu PureBasic gewechselt. ;-)
      ________________________________________________________

      PPFScanner PPFS Android MisterXMail@web.de
      Mfg AHT
    • Hier werden ja auch die CallBacks außerhalb der Spezifikation in der Hilfe eingesetzt. Das ist so nicht vorgesehen und kann schief gehen.
      Wenn man es denn doch unbedingt versuchen möchte, sollten in den CallBack-Prozeduren keinerlei Schleifen sein, keinerlei Dialogelemente erzeugt oder beschrieben werden geht) und nur lokale Variablen benutzt werden.

      Gruß
      Roland
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • RGH schrieb:

      Hier werden ja auch die CallBacks außerhalb der Spezifikation in der Hilfe eingesetzt.
      Natürlich. Gerade solche Sachen braucht man ja, wenn während das Programm auf eine Eingabe reagiert zum Beispiel gleichzeitig andere Sachen ablaufen sollen. Aber nicht nur da braucht man das in der Art. Auch bei Dienstzen gibt es zum Beispiel Callbacks, die genau dann abgearbeitet werden, wenn die Hauptprozedur in einer Schleife läuft.
      Gerade bei einer so langsamen Sprache wie XProfan braucht man das - oder man programmiert eben mit einer anderen sprache Anwendungen. ;-)
      ________________________________________________________

      PPFScanner PPFS Android MisterXMail@web.de
      Mfg AHT