XProfan X5

    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.

    • Zwei Wünsche hätte ich noch. Und ja, ich weiß, das lässt sich natürlich auch leicht in XProfan umsetzen, aber die Funktionen sind recht langsam, vor allem wenn man sie sehr oft in einem Programm benutzt, wie in meinem Fall. Als vorgefertigte Funktion wären sie natürlich deutlich schneller und für allgemein sinnvoll halte ich sie auch.

      Trim$() erweitern mit einem zweiten, optionalen Parameter, der angibt welches Zeichen abgeschnitten wird. In meinem Fall ist es \t und meine Funktion ist nicht besonders effizient:

      Quellcode

      1. Proc TrimX$
      2. Parameters s$,t$
      3. while Mid$(s$,1,1)=t$
      4. s$=Del$(s$,1,1)
      5. endwhile
      6. while Mid$(s$,Len(s$),1)=t$
      7. s$=Left$(s$,Len(s$)-1)
      8. endwhile
      9. Return s$
      10. endproc

      Das ließe sich vielleicht auch mit mehr als einem Zeichen umsetzen.

      Das zweite ist eine Funktion Undouble(). Sie ersetzt Mehrfachaufkommen durch einfaches Aufkommen, in meinem Fall " ". Das geht zwar auch mit Translate$(), aber wenn ich zum Beispiel alle mehrfachen Leerzeichen zu einem verkürzen will muss ich mehrere Durchläufe machen wenn " " darin vorkommt:

      Quellcode

      1. Proc Undouble
      2. Parameters s$,t$
      3. while InStr(t$+t$,s$)
      4. s$=Translate$(s$,t$+t$,t$)
      5. endwhile
      6. Return s$
      7. endproc

      ...für den Fall, dass jemand zufällig eine Assemblerversion davon rumliegen hat, wäre das natürlich auch super! :thumbsup:
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Danke für den Hinweis, Jac - ich wußte es vorher nicht, aber: Bei Version 11.2a entfernt XProfans TRIM$() offenbar alle ASCII-Zeichen zwischen 0 und (einschließlich) 32 (space). Mit dem Begriff ´Leerzeichen´ in der Hilfe sind offenbar alle nicht-druckenden bzw. Steuerzeichen gemeint.

      Ich hatte mal ein ähnliches Problem. Mein damaliger Workaround: Falls zu ´deletende´ Zeichen nicht auch im erwünschten Textteil liegen können, kann eine Positiv-Liste der erlaubten Zeichen in einem s$=match$("[~ A-ZÄÖÜa-zäöüß0-9~.~,~+~-~*]+",s$) deutlich beschleunigen.

      Gruss
    • Hallo Peter,
      mein Problem ist momentan, dass ich Zeilen bekomme, die gemischt sind mit beliebig vielen Leerzeichen und Tabs. Ich will die einzelnen Schlüsselworte rausfiltern, getrennt durch je ein Tab oder Leerzeichen und ohne Tabs/Leerzeichen an Anfang und Ende des Strings. Das zu programmieren ist kein Problem, nur ist es recht langsam in XProfan (ich muss einige hunderttausend Strings verarbeiten, und das am Laufenden Band). Deshalb lagere ich immer mehr Funktionen in eine PureBasic-DLL aus. Schöner wär's natürlich wenn XProfan wieder ein bisschen gut macht und nachzieht.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Wünsche haben wir ja viele.
      Da gebe ich auch mal einen zum besten :

      MOVE("ListToFile", S)

      Hier könnte man auch noch einen zweiten Parameter dazu machen.
      Optional mit 0 oder 1, was bedeutet :
      Soll die Datei mit dem Inhalt der Listboxliste erweitert werden
      oder ganz neu mit dem Inhalt der Listboxliste geschrieben
      werden ?

      Auch ein anwenderfreundliches Drag & Drop für Anfänger und
      Fortgeschrittene wäre längst mal fällig. Geht zwar selber mit
      API, das ist aber auch nicht jedermanns Sache. Gerade die
      API - Sachen werden von den Anfängern öfter in den Foren
      nachgefragt.

      Da gibt es noch ein paar Sachen, die ich mit der Zeit hier im
      Forum angeregt habe. Aber Roland hat es anscheinend gar
      nicht interessiert, bzw. hat es wegen Zeitmangel abgetan.
    • Die Frage ist nicht ob es sich lohnt, im Sinne von Gewinn bringen. Das tut XProfan schon länger nicht mehr. ;-)
      Es ist eher die Frage des Interesses an einer neuen Version, die Frage der Ideen für neue Funktionalitäten und vor allem auch eine Frage der Zeit die ich habe.
      Zur Zeit habe ich einen Fulltime-Job in Bielefeld, weswegen ich eine Zweitwohnung (ein möbliertes Zimmer) in Paderborn habe.
      (Ok, jetzt währen der Kontaktsperre arbeite ich zumeist von zu Hause aus und bin nur etwa alle drei Wochen für eine Woche in Paderborn/Bielefeld.)

      Grundsätzlich habe ich noch eine Version X5 geplant und das Angleichen von FreeProfan an die aktuelle Version.

      Gruß
      Roland

      ... und bleibt gesund!
      (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
    • Sehr geil. Der harte Kern hat auf jeden Fall Interesse und ich glaube es gibt auch noch ein paar Bugs zu fixen und Ungereimtheiten zu erörtern. Ich hab zum Beispiel Probleme mit addfiles in Verbindung mit Zip-Archiven, aber das muss ich erst selbst weiter testen. Und die Hash-Array-Geschichte ist ja auch noch nicht durch.

      Ich freue mich aber zu wissen, dass es noch nicht begraben ist.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Vielleicht wären auch Listen, in denen man sich eintragen kann,
      hilfreich. Eine, wer noch Interesse an XProfan hat und auch eine
      neue Version (egal jetzt ob SubScription, Update oder Vollversion)
      kaufen würde und eine, in die man die Wünsche und Anregungen
      für die Version X5 eintragen kann.

      Da hätte Roland (und auch wir) mal eine Übersicht und könnte
      die Punkte Interesse und Funktionalität besser beurteilen.

      Die Frage, ob Roland dann auch wirklich die Zeit dafür hat,
      steht ja auf einem anderen Blatt.
    • In der Tat, KJH!

      Ich bin auch dabei. Neue Subscription, neue Version, ein bisschen mehr Leben in den XProfan-Foren... Bei allen diesen Dingen.

      Und lasst Euch von den bisher wenigen Antworten hier nicht entmutigen. Ich habe diesen Thread gerade erst entdeckt und bin selber erstaunt, dass ich den ganzen Mist in der ersten Hälfte tapfer durchgelesen habe. Davon stimmt vieles, aber es 1000x zu wiederholen, nutzt niemandem etwas. Außerdem stimmt davon, wie ich gerade schrieb, nur vieles, aber bei weitem nicht alles. Dazu gleich mehr.

      Zunächst einmal bin sehr froh über mehr als nur ein Lebenszeichen von Roland! Ich habe bisher nur dann und wann im XProfan-eigenen Forum danach gesucht und hatte inzwischen wirklich Sorgen, dass die ganze Sache inzwischen beerdigt wurde. Zum Glück ist das offenbar nicht so.

      Nun dazu, was mit XProfan wirklich geht, auch wenn mancher das gar nicht glauben mag:

      Wenn man fortgeschritten (und trotzdem hobbymäßig wie ich) programmieren möchte, muss man sich mit der Windows-API auf "Du-und-Du" auskennen. Es ist im Prinzip relativ egal, ob Roland sich die Mühe macht, noch einige API-Funktionen mehr in XProfan-eigene Wrapper zu stecken oder nicht. Das muss man dann schon selbst können.

      Wenn man noch einen Schritt weitergehen möchte, kann man tatsächlich zwei der wichtigsten Beschränkungen von XProfan umgehen, und zwar mit den entsprechenden Tools sogar mit XProfan-Code!

      1.: Man darf sich nicht scheuen, wirklich geschwindigkeitskritische Dinge in eine DLL auszulagern, das tut nun wirklich nicht weh. Die kann man sogar mit XProfan-Code erzeugen, wenn man Profan2Cpp besitzt. Sonst geht's natürlich auch mit jeder anderen Sprache (PureBasic, was auch immer). Das sollte man mit einiger Erfahrung hinbekommen. Dann hat man zwei Fliegen mit einer Klappe geschlagen: Die unglaublich intuitive Art, in XProfan umständliche Dinge einfach zu programmieren, verbunden mit Geschwindigkeit, wo man sie braucht. Damit sind dann z.B. eigene Subclassing-Routinen überhaupt kein Problem mehr, wenn man nicht alles in die (langsame) XProfan-Subclassing-Proc stecken möchte, sondern für verschiedene Aufgaben unterschiedliche Subclassing-Procs nutzen möchte (wenn's interessiert, stelle ich gerne ein Beispiel zur Verfügung).

      2.: Multithreading ist dann ebenfalls kein großes Problem mehr. Man muss sich nur überlegen, was für einen Debugger man benutzen möchte, da XProfan damit natürlich von Hause aus nicht klarkommt und ein Programm meist einfach ohne Fehlermeldung abstürzt, wenn man mal wieder eine kritische Sektion nicht abgefangen hat. Aber das ist eben schon etwas für (sehr) fortgeschrittene XProfaner. Ich möchte nur darlegen, dass es geht.

      3.: 64-bit geht natürlich nicht. Aber das ist im Moment, soweit ich es sehe, (noch) kein echtes Problem. Mit COM-Objekten komme ich bislang ebenfalls nicht klar, da muss ich wohl mal PureBasic bemühen. Eine auf dieser Basis erstellte DLL ließe sich dann aber wiederum in XProfan nutzen, also in meiner Lieblingssprache.

      Wenn wir also ein bisschen kreativ sind, und das muss man immer und in jeder Sprache sein, dann ist mit XProfan auch heute noch so viel möglich, dass ich nicht nachvollziehen kann, dass es dafür keine Verwendung mehr gäbe.

      Zu guter Letzt zwei Beispiele, die Ihr gerne ausprobieren dürft und von denen ich gerne wüsste, ob sie zu gefallen vermögen, oder ob der Durchschnittsnutzer doch meint, das wäre in der heutigen Zeit nichts mehr:

      1. Ein Grafikanzeigeprogramm wie IrfanView, das allerdings bereits viel früher das meiste dessen konnte, was IrfanView heute kann (deshalb habe ich es mir damals überhaupt geschrieben; es wird bis heute weiterentwickelt):
      kanzlei-reumschuessel.de/UpdateChecker/setup_jrslideshow.exe
      Darin wird Multithreading benutzt, um das nächste Bild vorzuladen. Es ist eine (in meinen Augen...) vollwertige Bildverwaltung auf Basis von Firebird enthalten, mit der ich meine im Moment gut 27.000 digitalen Fotos in Sekunden wiederfinden kann, egal, wo sie sich auf der Festplatte befinden (fleißiges Taggen der Bilder vorausgesetzt natürlich). Man kann mit Google Earth, -Maps, Bing Maps oder mit OpenStreetMap aus dem Programm heraus anzeigen lassen, wo ein Bild aufgenommen wurde, sofern es GPS-Daten enthält. Alle relevanten EXIF-Daten können ausgelesen werden.

      2. Ein komfortables Tresor-Programm auf der Basis von CryptLib und Firebird, das nach heutigem Wissen alles, was Ihr so für das kleine oder große Geheimnis im täglichen Leben braucht, unknackbar verschlüsselt:
      kanzlei-reumschuessel.de/UpdateChecker/setup_xtresor.exe
      Es werden nicht lediglich in einer vorgegebenen Maske irgendwelche Passwörter gespeichert wie bei vielen Tresorprogrammen, sondern beliebig lange Freitexte auf Basis eines völlig in XProfan geschriebenen RTF-Editors, der auch Grafiken speichert, die Ihr dort hineinkopiert (natürlich auf der Grundlage der entsprechenden RichEdit-API-Funktionen; ich habe das Rad also nicht vollständig neu erfunden, aber das meiste dabei muss man schon "zu Fuß" erledigen). Es können zudem beliebige Dateien in die Datenbank gespeichert werden, also z.B. PDFs mit Euren neuesten Kontoauszügen. Es können Querverbindungen zu anderen Einträgen in der Datenbank hergestellt werden, und auch zu Dateien auf der Festplatte (z.B.: Die Anleitung zu diesem Programm liegt in D:\Eigene Dateien\Anleitungen\XYZ; ein Klick darauf genügt, um diese Datei in ihrem nativen Anzeigeprogramm zu öffnen).
      Selbstverständlich, eigentlich unnötig zu erwähnen, sind alle Daten unrettbar verloren, wenn das Passwort verlorengeht. Das gilt somit natürlich auch für meine eigene Datenbank, die inzwischen 1.106 Einträge umfasst. Also selbstredend keine Backdoor, dann müsste man so ein Projekt gar nicht erst in Angriff nehmen, jedenfalls meiner Meinung nach. Wer möchte, bekommt gerne den Quellcode.
      Weitere Features: Hash-Erzeugung und -Prüfung von Texten und Dateien; Passwortgenerator (wahlweise zeichenbasiert oder mnemonisch auf Grundlage der OpenThesaurus-Datenbank).

      Beide Programme kommen mit vollautomatischen Update-Checkern, natürlich ebenfalls alles in XProfan programmiert. Selbstredend sind es trotzdem Hobby-Projekte. Wenn sich also wirklich jemand die Mühe machen sollte, sie zu testen, und dabei Bugs findet, gerne her damit (jreumsc@web.de), aber bitte nett bleiben und notfalls was anderes benutzen. ;-)

      Ok. Keine Ahnung. Sehr viel Text. Vielleicht geht das alles in anderen Sprachen besser, schneller, schöner, ... Ich finde, die Ergebnisse sprechen trotzdem für XProfan und dafür, was man damit auch heute noch realisieren kann.

      Bleibt gesund, und auf zu neuen Ufern mit XProfan!

      Jens-Arne
    • Es gibt doch noch mehr Leute, die XProfan nutzen, als ich dachte.

      @Jens-Arne:
      Prinzipiell muss ich dir zustimmen, aber...

      Prf2Cpp ist veraltet und wird schon seit einiger Zeit nicht mehr aktualisiert. Ist für aktuelle Projekte also nicht zu gebrauchen. Ich besitze Prf2Cpp 1.6 und komme leider nicht weit damit.
      Multithreading mit XProfan musst du mal erklären. Am besten in einem separaten Thread. Multi-Processing get ja schon sehr gut, Multithreading meines Erachtens nur extrem kompliziert und unsicher.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Ich hab mal gestöbert, Jens-Arne hat in iFs Forum schon mal vorgestellt wie man Multithreading in XProfan realisieren kann, aber nur mit Prf2Cpp. Das Thema Multithreading wäre für XProfan X5 wirklich ein toller Aufhänger. Es geht sicher auch mittels APIs, aber das ist sehr umständlich zu realisieren, vor allem wenn mehrere Funktionen auf die gleichen Adressen zugreifen wollen.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Man kann auch schön mit den eigenen XProfan - Mitteln Schnelligkeit
      herausholen. So mißbrauche ich gerne öfters XProfan's MoveListProc,
      wenn es um schnelle Schleifen geht.
      Man muß ja nicht unbedingt bei den Move("...ToList",...) Funktionen
      die interne Listboxliste quälen. Da brauche ich halt nur die schnelle
      interne Schleife von Roland, um z.B. Ansammlungen von Strings usw.
      zu bearbeiten oder zu analysieren.
    • @jac de Lac: Nur APIs reichen für MultiThreading nicht. Du brauchst eine "echte" Funktionsadresse für die Threadprozedur, und die bekommst Du aus XProfan-Procs nicht. Deshalb muss man die Threadprozedur extern erstellen und als DLL zur Verfügung stellen.
      Ich hatte das in der Tat schonmal in iFs Forum vorgestellt. Allerdings hatte ich da, glaube ich, das Abfangen von kritischen Sektionen noch nicht so toll beschrieben. Mutexes z.B. tun es vernünftig.
      Sicher ist Profan2Cpp veraltet, aber wenn man nicht das ganze Programm damit kompilieren will, sondern "nur" z.B. SubclassProcs, sonstige wirklich geschwindigkeitskritische Dinge und ggf. MultiThreading-Procs, dann reicht es m.E. auch heute noch völlig aus.
      MultiThreading geht übrigens auch mit den nProcs von XPSE (denn auch die werden ja in einer DLL zur Verfügung gestellt), dort sogar mit eigenen Prozeduren zum Threadhandling, allerdings finde ich den Profan2Cpp-Ansatz flexibler.

      Gruß, Jens-Arne

      PS: Hier nochmal das MultiThreading-Beispiel (diesmal mit Mutex zum Absichern kritischer Sektionen):

      1. XProfan-Hauptprogramm:

      Quellcode

      1. 'Multithreading-Beispiel mit Profan-ThreadProc in C-DLL über Profanf2Cpp
      2. $H windows.ph
      3. declare hDLL&,uwp&,CProcAddr&
      4. declare hText1&,hText2&,hText3&
      5. declare s1$,s2$,s3$
      6. declare hThread1&,hThread2&,hThread3&
      7. declare ThreadRunning1&,ThreadRunning2&,ThreadRunning3&
      8. declare hMutex&
      9. cls ~GetSysColor(4) 'Hauptfenster mit Hintergrundgrau erstellen (weil die Text-Dialogelemente in dieser Farbe gehalten sind)
      10. usermessages $1000 'mit dieser Message signalisiert ein Thread, dass er sich nun beendet (das kann zusätzlich mit den Flags ThreadRunningX& überprüft werden, was in diesem Beispiel aber nicht benutzt wird)
      11. hText1&=@create("TEXT",%HWnd,"0",10,10,300,20) 'hier wird Thread 1 reinschreiben
      12. hText2&=@create("TEXT",%HWnd,"0",10,35,300,20) 'hier wird Thread 2 reinschreiben
      13. hText3&=@create("TEXT",%HWnd,"0",10,60,300,20) 'hier wird Thread 3 reinschreiben
      14. hDLL&=@usedll("MultithreadingBeispielC.dll") 'in dieser DLL ist die Thread-Prozedur enthalten
      15. hMutex&=~CreateMutexA(0,0,0)
      16. 'Threads starten
      17. CProcAddr&=~GetProcAddress(hDLL&,"Count_C") '"echte" ProcAddr der in die DLL ausgelagerten Prozedur beziehen (mit direkten Profan-Prozeduren geht das nicht, sodass Profan selbst nicht multithreading-fähig ist)
      18. s1$=@str$(%HWnd)+"~"+@str$(@addr(ThreadRunning1&))+"~"+@str$(hMutex&)+"~"+@str$(hText1&)+"~1" 'Übergabestring für Thread 1 mit dem Hauptfensterhandle, dem Flag ThreadRunning, dem Mutex-Handle, dem Handle des Text-Dialogelements und dem Startwert füttern
      19. hThread1&=~CreateThread(0,0,CProcAddr&,@addr(s1$),0,0) 'Thread 1 starten
      20. s2$=@str$(%HWnd)+"~"+@str$(@addr(ThreadRunning2&))+"~"+@str$(hMutex&)+"~"+@str$(hText2&)+"~-10000" 'Übergabestring für Thread 1 mit dem Hauptfensterhandle, dem Flag ThreadRunning, dem Mutex-Handle, dem Handle des Text-Dialogelements und dem Startwert füttern
      21. hThread2&=~CreateThread(0,0,CProcAddr&,@addr(s2$),0,0) 'Thread 2 starten
      22. s3$=@str$(%HWnd)+"~"+@str$(@addr(ThreadRunning3&))+"~"+@str$(hMutex&)+"~"+@str$(hText3&)+"~12345678" 'Übergabestring für Thread 1 mit dem Hauptfensterhandle, dem Flag ThreadRunning, dem Mutex-Handle, dem Handle des Text-Dialogelements und dem Startwert füttern
      23. hThread3&=~CreateThread(0,0,CProcAddr&,@addr(s3$),0,0) 'Thread 3 starten
      24. 'Auf das Ende der Threads warten und reagieren
      25. while (@gettext$(hText1&)<>"Fertig.") or (@gettext$(hText2&)<>"Fertig.") or (@gettext$(hText3&)<>"Fertig.")
      26. waitinput
      27. if %umessage=$1000 'ein Thread signalisiert, dass er sich jetzt beendet und übergibt dabei sein Texthandle in &UwParam
      28. uwp&=&UwParam
      29. if uwp&=hText1&
      30. while ~WaitForSingleObject(hMutex&,~INFINITE)=4294967295 '4294967295=~WAIT_FAILED; funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      31. endwhile
      32. settext hText1&,"Fertig."
      33. while ~ReleaseMutex(hMutex&)=0 'funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      34. endwhile
      35. elseif uwp&=hText2&
      36. while ~WaitForSingleObject(hMutex&,~INFINITE)=4294967295 '4294967295=~WAIT_FAILED; funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      37. endwhile
      38. settext hText2&,"Fertig."
      39. while ~ReleaseMutex(hMutex&)=0 'funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      40. endwhile
      41. elseif uwp&=hText3&
      42. while ~WaitForSingleObject(hMutex&,~INFINITE)=4294967295 '4294967295=~WAIT_FAILED; funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      43. endwhile
      44. settext hText3&,"Fertig."
      45. while ~ReleaseMutex(hMutex&)=0 'funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      46. endwhile
      47. endif
      48. endif
      49. endwhile
      50. waitinput 'damit man das Ende mit 3x "Fertig." sieht
      51. 'aufräumen
      52. ~CloseHandle(hThread1&)
      53. ~CloseHandle(hThread2&)
      54. ~CloseHandle(hThread3&)
      55. ~CloseHandle(hMutex&)
      56. usermessages 0
      57. freedll hDLL&
      58. end
      Alles anzeigen




      2. Profan2Cpp-Thread-DLL:

      Quellcode

      1. $DLL
      2. $H windows.ph
      3. DLLPROC Count_C,1,"Count_C"
      4. parameters param#
      5. declare i&,a&,s$,hAufrufer&,ThreadRunning#,hMutex&,hText&,StartWert&
      6. s$=@string$(param#,0)
      7. 'als erstes das Flag für das aufrufende Programm setzen, dass der Thread läuft (müsste man, wenn das Hauptprogramm diese Variable abfragen würde, ebenfalls per Mutex absichern)
      8. a&=val(@substr$(s$,2,"~"))
      9. ThreadRunning#=a&
      10. long ThreadRunning#,0=1
      11. 'Aufrufer-Fensterhandle ermitteln (damit man Messages dahin versenden kann)
      12. hAufrufer&=@val(@substr$(s$,1,"~"))
      13. 'Mutex-Handle ermitteln
      14. hMutex&=@val(@substr$(s$,3,"~"))
      15. 'Textcontrol-Handle ermitteln
      16. hText&=@val(@substr$(s$,4,"~"))
      17. 'Startwert ermitteln
      18. StartWert&=@val(@substr$(s$,5,"~"))
      19. 'Zählung durchführen (eigentliche Arbeitsroutine des Threads)
      20. i&=StartWert&
      21. while i&<=StartWert&+750
      22. while ~WaitForSingleObject(hMutex&,~INFINITE)=~WAIT_FAILED 'funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, ist aber absolut kritisch, daher die while-Schleife
      23. endwhile
      24. settext hText&,@str$(i&) 'settext benutzt eine API-Funktion, die nicht gleichzeitig von mehreren Threads oder dem Hauptprogramm aufgerufen werden darf, daher die Absicherung durch den Mutex
      25. while ~ReleaseMutex(hMutex&)=0 'funktioniert in seltenen Fällen nicht sofort beim ersten Aufruf, daher die while-Schleife
      26. endwhile
      27. i&=i&+1
      28. endwhile
      29. 'Rückgabewert übermitteln
      30. @sendmessage(hAufrufer&,$1000,hText&,0) 'dem aufrufenden Programm eine Usermessage senden, dass der Thread sich nun beendet
      31. long ThreadRunning#,0=0 'Flag für das aufrufende Programm dafür, dass der Thread läuft, löschen (müsste man, wenn das Hauptprogramm diese Variable abfragen würde, ebenfalls per Mutex absichern)
      32. return 0
      33. ENDPROC
      Alles anzeigen

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Jens-Arne () aus folgendem Grund: Beispielcode eingefügt

    • Was mir heute noch aufgefallen ist und ich mir wünsche: Eine asynchrone Version von AddFiles. Das ist einer der Befehle, die das ganze Programm anhalten, und das manchmal für Recht lange Zeit. Mit optionaler Statusvariable oder Callback wäre das viel angenehmer im Handling.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Wie schnell ist denn FindFirst$ und FindNext$ ?
      Könnte man das nicht in einem Prozess auslagern,
      um wenigstens ohne, daß das Programm anhält,
      weiter zu arbeiten ?

      Andererseits wäre dein Vorschlag aber auch nicht schlecht.

      Wird aber auch problematisch :

      RGH schrieb:

      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.
    • FindFirst/FindNext sind nicht besonders schnell. Auslagern geht sicher, aber eine vorgefertigte Variante wäre natürlich viel eleganter.
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • liegt schon etwas zurück, aber ich hatte zu der Zeit auch eine ähnliche Zeitintensive Routine.
      Beholfen hab ich mir mit einem 2. Prozess. Die Kommunikation hab ich dann mit Messages/Usermessages gelöst, die ja in der Ereignisschleife super abgearbeitet werden können (geht sogar in beide Richtungen).
      Auch der Austausch von Daten etc. funktionierte gut. Weiß bloß nicht genau, ob ich das über gemeinsame Speicherbereiche /Speicherdateien o.ä. gelöst hab.
      Kleine Datenmengen (Flags, Werte etc.) gehen ja auch gut über die Messages
      Ich müsste mal nachstöbern...
      Gruß Jörg

      Ideen gibt es viele - man muß sie nur haben...
      Win7-Pro / Linux Mint
    • Ich muss das mit einem zweiten Prozess mal probieren. Bei mir geht's um 400000 Dateien und mehr. Verschlechtern kann es sich ja kaum. :-)
      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
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net