SDK-Helfer/ Tools | | | | 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 | | Ladeanzahl: | | | | 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
| | | | XProfan 11Computer: 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
|
| | | | |
| | | [offtopic] Posesiones el Thema en el Biblioteca después de SDK-Helfer y Tools movido. [/offtopic] |
| | | | |
| | 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 X3XProfan 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... |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |