SDK-Helfer/ Tools | | | | Jens-Arne Reumschüssel | ici lieu je une Methode avant, Multithreading avec XProfan trop realisieren.
----- Hinweis: cela pour cette Artikel benötigte Zusatzprogramm Profan2Cpp gibt es ici: [...] -----
oui, XProfan ist pas multithreadingfähig, c'est ça et bleibt jusqu'à sur weiteres aussi so. il y a mais une Weg, ca avec reinem XProfan comme Programmiersprache doch trop realisieren. cette führt sur den le détour, dass qui Procédure, qui comme eigener asynchroner Fil gestartet volonté soll, avec Profan2Cpp dans un C-DLL ausgelagert wird. ca wird ici à einem einfachen Beispiel erläutert, welches simple seulement dans trois XProfan-Text-Controls une vorgegebenen Wert um 10.000 hochzählt. chacun Counter fonctionne dans einem eigenen Fil, qui sich après finissez et dabei sur sendmessage une Rückgabewert (ici cela Handle seines Text-Controls) à une im aufrufenden Programme definierte usermessage übermittelt.
Multithreading bietet den unschätzbaren Vorteil, im "Hintergrund" Aufgaben erledigen trop peut, au cours de cela Hauptprogramm weiterläuft, et dabei Handles et Speicherelemente austauschen trop peut. XProfan ist zwar multiprozessingfähig, mais dabei fonctionne qui neue Prozess dans einem getrennten Adressraum, quoi qui Rückgabe de récente angelegten Handles etc. verhindert. Multithreading hingegen bietet oui c'est ca ca: une gemeinsamen Adressraum de aufrufendem Programme et dem neuen Fil. mais attention, ca birgt aussi Risiken. Hierzu s'il te plaît absolument qui Hinweise entier unten sous den Code-Beispielen lesen! cet sommes bestimmt encore pas vollständig, Ergänzungen sommes volontiers willkommen.
Beide Code-Beispiele sommes intensif kommentiert, sodass je hoffe, dass on sans Weiteres versteht, quoi là geschieht.
ici zunächst qui XProfan-Procédure, qui avec Profan2Cpp dans un C-DLL traduit volonté muss (s'il te plaît qui Dossier MultithreadingBeispielC.prf appeler et qui erzeugte DLL dans cela Verzeichnis des XProfan-Hauptprogramms kopieren, cela après comme Code-Beispiel folgt):
[Alternativ gibt's qui fertige DLL aussi ici, si quelqu'un avec Profan2Cpp im Moment pas up to date ist: Herunterladen]
$DLL
DLLPROC Count_C,1,"Count_C"
parameters param#
declare i&,a&,s$,hAufrufer&,ThreadRunning#,hText&,StartWert&
s$=@string$(param#,0)
'comme erstes cela Flag pour cela aufrufende Programme mettons, dass qui Fil fonctionne
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&
tandis que i&<=StartWert&+10000
settext hText&,@str$(i&)
inc i&
endwhile
'Rückgabewert übermitteln
@sendmessage(hAufrufer&,$1000,hText&,0)
long ThreadRunning#,0=0'Flag pour cela aufrufende Programme pour, dass qui Fil fonctionne, effacer
return 0
ENDPROC
eh bien folgt cela normale XProfan-Programme, cela qui trois Threads, qui eingangs erwähnt wurden, aufruft et sur en Ende wartet:
'Multithreading-Beispiel avec XProfan-ThreadProc dans C-DLL sur Profan2Cpp
$H windows.ph
declare hDLL%,uwp&,CProcAddr&
declare hText1&,hText2&,hText3&
declare s1$,s2$,s3$
declare hThread1&,hThread2&,hThread3&
declare ThreadRunning1&,ThreadRunning2&,ThreadRunning3&
cls ~getsyscolor(4)'Hauptfenster avec Hintergrundgrau erstellen (weil qui Text-Dialogelemente dans cette la couleur gehalten sommes)
usermessages $1000'avec cette Message signalisiert un fil, dass il sich eh bien finissez (cela peux zusätzlich avec den Flags ThreadRunningX& überprüft volonté, quoi dans diesem Beispiel mais pas benutzt wird)
hText1&=@create("TEXT",%HWnd,"0",10,10,300,20)'ici wird Fil 1 reinschreiben
hText2&=@create("TEXT",%HWnd,"0",10,35,300,20)'ici wird Fil 2 reinschreiben
hText3&=@create("TEXT",%HWnd,"0",10,60,300,20)'ici wird Fil 3 reinschreiben
hDLL%=@usedll("MultithreadingBeispielC.dll")'dans cette DLL ist qui Fil-Procédure enthalten
'Threads starten
CProcAddr&=~GetProcAddress(hDLL%,"Count_C")'"echte" ProcAddr qui dans qui DLL ausgelagerten Procédure beziehen (avec direkten Profan-Prozeduren allez cela pas, sodass Profan selbst pas multithreading-fähig ist)
s1$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning1&))+"²~³"+@str$(hText1&)+"²~³1"'Übergabestring pour Fil 1 avec dem Hauptfensterhandle, dem Flag ThreadRunning, dem Handle des Text-Dialogelements et dem Startwert füttern
hThread1&=~createthread(0,0,CProcAddr&,@addr(s1$),0,0)'Fil 1 starten
s2$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning2&))+"²~³"+@str$(hText2&)+"²~³-10000"'Übergabestring pour Fil 2 avec dem Hauptfensterhandle, dem Flag ThreadRunning, dem Handle des Text-Dialogelements et dem Startwert füttern
hThread2&=~createthread(0,0,CProcAddr&,@addr(s2$),0,0)'Fil 2 starten
s3$=@str$(%HWnd)+"²~³"+@str$(@addr(ThreadRunning3&))+"²~³"+@str$(hText3&)+"²~³12345678"'Übergabestring pour Fil 3 avec dem Hauptfensterhandle, dem Flag ThreadRunning, dem Handle des Text-Dialogelements et dem Startwert füttern
hThread3&=~createthread(0,0,CProcAddr&,@addr(s3$),0,0)'Fil 3 starten
'sur cela Ende qui Threads attendre et réagir
tandis que (@gettext$(hText1&)<>"Fertig.") or (@gettext$(hText2&)<>"Fertig.") or (@gettext$(hText3&)<>"Fertig.")
waitinput
si %umessage=$1000'un fil signalisiert, dass il sich maintenant finissez et übergibt dabei son Texthandle dans &UwParam
uwp&=&UwParam
si uwp&=hText1&
settext hText1&,"Fertig."
elseif uwp&=hText2&
settext hText2&,"Fertig."
elseif uwp&=hText3&
settext hText3&,"Fertig."
endif
endif
endwhile
waitinput'avec cela on cela Ende avec 3x "Fertig." sieht
'aufräumen
~closehandle(hThread1&)
~closehandle(hThread2&)
~closehandle(hThread3&)
usermessages 0
freedll hDLL%
end
Hinweise: · un sur cet Weise erzeugter Fil benutzt den Adressraum des aufrufenden Programms, weswegen problemlos Handles ausgetauscht volonté peut. Dabei fonctionne cela Hauptprogramm plus, au cours de qui Fil im "Hintergrund" (=asynchron) arbeitet. je benutze z.B. une solchen Fil, um dans einem Bildanzeigeprogramm cela jeweils prochain Bild vorzuladen et dessen Handle à cela aufrufende Programme zurückzuübermitteln (mittels qui im Beispiel benutzten sendmessage-Methode).
· Einem récente trop startenden Fil peux seulement exakt un paramètre transfert volonté. Es bietet sich daher à, comment dans dem Beispiel hierzu une String trop benutzen, dans dem alle notwendigen Informationen avec einem possible unzweideutigen Séparateur getrennt (ici "²~³") enthalten sommes.
· il y a une Windows-API-Funktion "GetExitCodeThread", qui u.a. ermitteln soll, si un fil encore aktiv ist. cet Funktion funktioniert jusqu'à aujourd'hui (Windows 10) pas zuverlässig, mais liefert ensuite et quand unvorhersehbar un Ende des Threads zurück, quoique cette encore fonctionne. Daher ist dans dem obigen Beispiel déjà qui Workaround incorporé, qui mais dans dem Beispiel pas benutzt wird: qui Fil sollte trop seinem Beginn un Flag, dessen Adresse ihm transfert wurde, sur 1 mettons, cela dem aufrufenden Programme dessen Ausführung signalisiert, et direct avant dem Fil-Ende sollte cet Flag sur 0 gesetzt volonté.
· whileloop sollte dans einem Fil pas benutzt volonté. ca pourrait avec weiteren whileloops im aufrufenden Programme ou bien simultan laufenden anderen Threads kollidieren. tandis que avec Zählervariable ist sous C de toute façon genauso vite.
· si on im Fil externe Funktionen aufruft, qui aussi im aufrufenden Programme (ou bien dans weiteren Threads) gleichzeitig benutzt volonté könnten, muss on cet Kollision avec einem gemeinsam genutzten Flag abfangen; es muss ensuite im jeweiligen Fil/im aufrufenden Programme so longtemps gewartet volonté, jusqu'à qui Funktion wieder libre ist. Sonst peux es trop einem Absturz sans Fehlermeldung venons.
cela Prinzip qui gemeinsamen Nutzung de Flags sollte par den paramètre-Übergabestring im Beispiel bien sûr geworden son. toujours daran penser: Es wird, anders comme beim Multiprozessing, un gemeinsamer Adressraum aller Threads et des aufrufenden Programmes verwendet, quoi gewünscht ist, mais aussi trop Kollisionen mener peux.
· Im aufrufenden Programme déjà initialisierte DLL (usedll) dürfen dans qui Fil-DLL pas encore einmal initialisiert volonté (sonst Programmabsturz). qui Einbindung qui entsprechenden INC-Dossier reicht.
· Alle avec ~createthread erstellten Threads doit pour en Beendigung avec ~closehandle wieder entfernt volonté.
Viel Amusement beim Ausprobieren, et Anregungen sommes naturellement jederzeit willkommen! |
| 232 kB | | Bezeichnung: | BeispielC.dll | | Version: | 1.0 | | Kurzbeschreibung: | Fertige DLL pour cela Multithreading-Beispiel | | Hochgeladen: | 20.06.2018 | | Downloadcounter: | | | | Herunterladen |
| | | 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 concept!
Treffenderer Titel wäre peut-être "Multithreading per Profan2Cpp", là Multithreading avec XProfan entweder ab X4 per Inline-ASM-Funktionsadressen ou bien per xpse avec nProcs ( Threadbeispiele [...] [...] ) durchaus sonst relativ simple anzuwenden ist.
cls
// 3 threads per myThread-Proc
createThread(,,procAddr(myThread,1),,,)
createThread(,,procAddr(myThread,1),,,)
createThread(,,procAddr(myThread,1),,,)
waitinput
nproc myThread
parameters data&
//...
return data&
endproc
|
| | | | |
| | | [offtopic] Habe cela Thema dans qui Bibliothèque pour SDK-Helfer et Tools déménagé. [/offtopic] |
| | | | |
| | Jens-Arne Reumschüssel | Moin,
oui bien sûr, cela allez naturellement déjà longtemps avec nProcs, et c'est bien sûr absolu qui Erwähnung wert. Allerdings ist on avec "normalen" XProfan-Procs flexibler. dans meinem erwähnten Grafikanzeigeprogramm marcher nProcs malheureusement pas, weil XPSE là irgendwo aussteigt (seulement, si on nProcs verwenden voudrais, pas generell). wohin, sais je pas, weil je encore aucun Lust hatte, 16.000 Zeilen pour et pour auszukommentieren, à Stelle pour trouver, wohin es hakt, mais ça ne fait rien. Grundsätzlich ca va oui. Avec l' den Inline-ASM-Funktionsadressen c'est moi incidemment pas bien sûr. peux on avec cela normale Prozeduren zugänglich faire, ou bien doit qui dans Assembler geschrieben son?
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 vous encore dans Assembler geschrieben worden son.
c'est pourquoi serait mich un XPSE-Update reizen, dass cela "nProfan" dans XProfan-Inline-Asm umsetzt. je pourrait là probablement aussi viel "Overhead" einsparen et neue Ordre dans XPSE apporter. mais qui Reihe pour... |
| | | | |
|
répondreOptions du sujet | 6.140 Views |
Themeninformationencet Thema hat 3 participant: |