Español
SDK-Helfer/ Tools

Multithreading con XProfan y Profano2Cpp

 

Jens-Arne
Reumschüssel
Hier lugar Yo una Método antes, Multithreading con XProfan a realisieren.

-----
Referencia: Das para esta Artikel benötigte Zusatzprogramm Profano2Cpp hay hier:  [...] 
-----

Sí, XProfan es no multithreadingfähig, el stimmt y restos salvo weiteres auch así. Lo son aber una Weg, dies con reinem XProfan como Lenguaje de programación doch a realisieren. Dieser führt encima el Umweg, dass el Procedimiento, el como eigener asynchroner Thread started voluntad se, con Profano2Cpp en un C-DLL ausgelagert se. Dies se hier a una einfachen Ejemplo erläutert, welches simplemente sólo en drei XProfan-Texto-Controls una vorgegebenen Valor en 10.000 hochzählt. Jeder Counter se ejecuta en un eigenen Hilo, el se danach final y esta encima sendmessage una Rückgabewert (hier el Handle seines Texto-Controls) a una en el aufrufenden Programa definierte usermessage übermittelt.

Multithreading bietet el unschätzbaren Vorteil, en el "Hintergrund" Aufgaben erledigen a puede, während el Hauptprogramm weiterläuft, y esta Handles y Speicherelemente austauschen a puede. XProfan Aunque multiprozessingfähig, aber esta se ejecuta el neue Prozess en un getrennten Adressraum, lo que el Rückgabe de neu angelegten Handles etc. verhindert. Multithreading hingegen bietet genau dies: una gemeinsamen Adressraum de aufrufendem Programa y el neuen Hilo. Aber Achtung, dies birgt auch Risiken. Hierzu Por favor, necesariamente el Hinweise bastante unten bajo el código-Beispielen lesen! Diese son determinado todavía no vollständig, Ergänzungen son gerne willkommen.

Beide Code-Beispiele son intensiv kommentiert, sodass Yo hoffe, dass uno sin Weiteres versteht, qué hay geschieht.

Hier primero el XProfan-Procedimiento, el con Profano2Cpp en un C-DLL traducido voluntad muss (Por favor, el Expediente MultithreadingBeispielC.prf nennen y el erzeugte DLL en el Directorio des XProfan-Hauptprogramms kopieren, el danach como Code-Ejemplo folgt):

[Alternativ gibt's el fertige DLL auch hier, si alguien con Profano2Cpp en el Moment no up to date es: Descargar]
 $DLL

DLLPROC Count_C,1,"Count_C"

    parámetros param#
    declarar i&,a&,s$,hAufrufer&,ThreadRunning#,hText&,StartWert&
    s$=@cadena$(param#,0)
    'como erstes el Flag para el aufrufende Programa conjunto, dass el Hilo se ejecuta
    a&=val(@substr$(s$,2,"²~³"))
    ThreadRunning#=a&
    long ThreadRunning#,0=1
    'Aufrufer-Fensterhandle ermitteln
    hAufrufer&=@val(@substr$(s$,1,"²~³"))
    'Textcontrol-Handle ermitteln
    hText&=@val(@substr$(s$,3,"²~³"))
    'Startwert ermitteln
    StartWert&=@val(@substr$(s$,4,"²~³"))
    'Zählung durchführen
    i&=StartWert&

    mientras que i&<=StartWert&+10000

        settext hText&,@str$(i&)
        inc i&

    endwhile

    'Rückgabewert übermitteln
    @sendmessage(hAufrufer&,$1000,hText&,0)
    long ThreadRunning#,0=0'Flag para el aufrufende Programa dafür, dass el Hilo se ejecuta, löschen
    volver 0

ENDPROC


Nun folgt el normale XProfan-Programa, el el drei Hilos, el eingangs erwähnt fueron, aufruft y en deren Ende wartet:
'Multithreading-Ejemplo con XProfan-ThreadProc en C-DLL encima Profano2Cpp
 $H windows.ph
declarar hDLL%,uwp&,CProcAddr&
declarar hText1&,hText2&,hText3&
declarar s1$,s2$,s3$
declarar hThread1&,hThread2&,hThread3&
declarar ThreadRunning1&,ThreadRunning2&,ThreadRunning3&
cls ~getsyscolor(4)'Ventana principal con Hintergrundgrau redactar (porque el Texto-Dialogelemente en dieser Farbe mantenido son)
usermessages $1000'con dieser Message signalisiert un hilo, dass él se nun final (el kann zusätzlich con el Flags ThreadRunningX& überprüft voluntad, qué en diesem Ejemplo pero no benutzt se)
hText1&=@create("TEXT",%HWnd,"0",10,10,300,20)'hier se Hilo 1 reinschreiben
hText2&=@create("TEXT",%HWnd,"0",10,35,300,20)'hier se Hilo 2 reinschreiben
hText3&=@create("TEXT",%HWnd,"0",10,60,300,20)'hier se Hilo 3 reinschreiben
hDLL%=@usedll("MultithreadingBeispielC.dll")'en dieser DLL Es el Hilo-Procedimiento enthalten
'Hilos starten
CProcAddr&=~GetProcAddress(hDLL%,"Count_C")'"echte" ProcAddr el en el DLL ausgelagerten Procedimiento beziehen (con direkten Profano-Prozeduren va el no, sodass Profano incluso no multithreading-fähig es)
s1$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning1&))+"²~³"+@str$(hText1&)+"²~³1"'Übergabestring para Hilo 1 con el Hauptfensterhandle, el Flag ThreadRunning, el Handle des Texto-Dialogelements y el Startwert füttern
hThread1&=~createthread(0,0,CProcAddr&,@addr(s1$),0,0)'Hilo 1 starten
s2$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning2&))+"²~³"+@str$(hText2&)+"²~³-10000"'Übergabestring para Hilo 2 con el Hauptfensterhandle, el Flag ThreadRunning, el Handle des Texto-Dialogelements y el Startwert füttern
hThread2&=~createthread(0,0,CProcAddr&,@addr(s2$),0,0)'Hilo 2 starten
s3$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning3&))+"²~³"+@str$(hText3&)+"²~³12345678"'Übergabestring para Hilo 3 con el Hauptfensterhandle, el Flag ThreadRunning, el Handle des Texto-Dialogelements y el Startwert füttern
hThread3&=~createthread(0,0,CProcAddr&,@addr(s3$),0,0)'Hilo 3 starten
'Auf el Ende el Hilos warten y reagieren

mientras que (@gettext$(hText1&)<>"Fertig.") or (@gettext$(hText2&)<>"Fertig.") or (@gettext$(hText3&)<>"Fertig.")

    waitinput

    if %umessage=$1000'un hilo signalisiert, dass él se ahora final y übergibt esta ser Texthandle en &UwParam

        uwp&=&UwParam

        if uwp&=hText1&

            settext hText1&,"Fertig."

        elseif uwp&=hText2&

            settext hText2&,"Fertig."

        elseif uwp&=hText3&

            settext hText3&,"Fertig."

        endif

    endif

endwhile

waitinput'así al Ende con 3x "Fertig." sieht
'aufräumen
~closehandle(hThread1&)
~closehandle(hThread2&)
~closehandle(hThread3&)
usermessages 0
freedll hDLL%
end

Hinweise:
· Ein en esta Weise erzeugter Hilo benutzt el Adressraum des aufrufenden Programms, weswegen problemlos Handles ausgetauscht voluntad puede. Dabei se ejecuta el Hauptprogramm más, während el Hilo en el "Hintergrund" (=asynchron) arbeitet. Yo benutze z.B. una solchen Hilo, en en un Bildanzeigeprogramm el jeweils nächste Bild vorzuladen y dessen Handle a el aufrufende Programa zurückzuübermitteln (mittels el en el Ejemplo benutzten sendmessage-Método).

· Einem neu a startenden Hilo kann sólo exakt una Parámetro transferencia voluntad. Lo bietet se por lo tanto a, como en el Ejemplo hierzu una String a benutzen, en el todos notwendigen Informationen con un möglichst unzweideutigen Separador getrennt (hier "²~³") enthalten son.

· Lo son una Windows-API-Función "GetExitCodeThread", el u.a. ermitteln se, si un hilo todavía aktiv es. Diese Función funktioniert a heute (Windows 10) no zuverlässig, pero liefert entonces y wann unvorhersehbar una Ende des Hilos zurück, obwohl dieser todavía se ejecuta. Daher es en el obigen Ejemplo ya el Workaround instalado, el aber en el Ejemplo no benutzt se: Der Hilo debería a seinem Beginn una Flag, dessen Adresse ihm transferencia wurde, en 1 conjunto, el el aufrufenden Programa dessen Ausführung signalisiert, y direkt antes el Hilo-Ende debería dieses Flag en 0 gesetzt voluntad.

· whileloop debería en un Hilo no benutzt voluntad. Dies podría con más whileloops en el aufrufenden Programa oder simultan laufenden otro Hilos kollidieren. mientras que con Zählervariable es bajo C ohnehin genauso rápidamente.

· Wenn uno en el Hilo externe Características aufruft, el auch en el aufrufenden Programa (oder en más Hilos) gleichzeitig benutzt voluntad könnten, muss uno esta Kollision con un gemeinsam genutzten Flag abfangen; lo muss entonces en el jeweiligen Hilo/en el aufrufenden Programa así largo gewartet voluntad, a el Función otra vez frei es. Sonst kann lo a una Choque sin Fehlermeldung kommen.

El principio el gemeinsamen Nutzung de Flags debería por el Parámetro-Übergabestring en el Ejemplo klar geworden ser. Immer daran denken: Lo se, anders como beim Multiprozessing, una gemeinsamer Adressraum aller Hilos y des aufrufenden Programmes verwendet, qué gewünscht es, aber auch a Kollisionen führen kann.

· Im aufrufenden Programa ya initialisierte DLL (usedll) dürfen en el Hilo-DLL no todavía una vez initialisiert voluntad (sonst Programmabsturz). El Einbindung el entsprechenden INC-Expediente reicht.

· Alle con ~createthread erstellten Hilos necesario después de deren Beendigung con ~closehandle otra vez lejos voluntad.

Viel Spaß beim Ausprobieren, y Sugerencias son natürlich en cualquier momento willkommen!

232 kB
Bezeichnung:BeispielC.dll
Versión:1.0
Kurzbeschreibung: Fertige DLL para el Multithreading-Ejemplo
Hochgeladen:20.06.2018
Ladeanzahl160
Descargar
 
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
19.06.2018  
 




p.specht

Tolle Sache - Gracias!
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
20.06.2018  
 



Coole Concepto!

Treffenderer Titel wäre tal vez "Multithreading por Profano2Cpp", como Multithreading con XProfan entweder de X4 por Inline-ASM-Funktionsadressen oder por xpse con nProcs ( Threadbeispiele  [...]   [...]  ) durchaus sonst relativ simplemente anzuwenden es.
cls
// 3 threads por myThread-Proc
createThread(,,procAddr(myThread,1),,,)
createThread(,,procAddr(myThread,1),,,)
createThread(,,procAddr(myThread,1),,,)
waitinput

nproc myThread

    parámetros data&
    //...
    volver data&

ENDPROC

 
20.06.2018  
 



[offtopic]
Posesiones el Thema en el Biblioteca después de SDK-Helfer y Tools movido.
[/offtopic]
 
20.06.2018  
 




Jens-Arne
Reumschüssel
Moin,

sí klar, el va natürlich ya largo con nProcs, y el es selbstverständlich absolut el Erwähnung wert. Sin embargo, uno con "normalen" XProfan-Procs flexibler. In mi erwähnten Grafikanzeigeprogramm trabajo nProcs por desgracia, no, porque XPSE como irgendwo aussteigt (sólo, si uno nProcs uso möchte, no generell). Wo, weiß Yo no, porque Todavía no Lust hatte, 16.000 Zeilen después de y después de auszukommentieren, a Punto para encontrar, wo lo hakt, aber el macht nichts. Grundsätzlich es sí. Con el el Inline-ASM-Funktionsadressen me está de paso no está claro. Kann uno así normale Prozeduren zugänglich hacer, oder necesario el en Ensamblador geschrieben ser?

Beste Grüße, Jens-Arne
 
XProfan X3
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
23.06.2018  
 



Momentan müssten ellos aún en Ensamblador geschrieben worden ser.

Deshalb sería mich una XPSE-Actualización reizen, dass el "nProfan" en XProfan-Inline-Asm umsetzt. Yo podría como vermutlich auch viel "Overhead" einsparen y neue Orden en XPSE bringen. Aber el Reihe después de...
 
26.06.2018  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

6.125 Views

Untitledvor 0 min.
Sven Bader21.11.2023
funkheld25.09.2023
Thomas24.04.2023
Axel Berse20.02.2023
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie