Français
SDK-Helfer/ Tools

Multithreading avec XProfan et Profan2Cpp

 

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
Downloadcounter160
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

Tolle l'affaire - merci!
 
XProfan 11
Computer: 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

 
20.06.2018  
 



[offtopic]
Habe cela Thema dans qui Bibliothèque pour SDK-Helfer et Tools déménagé.
[/offtopic]
 
20.06.2018  
 




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 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 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...
 
26.06.2018  
 



répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

6.150 Views

Untitledvor 0 min.
Sven Bader21.11.2023
funkheld25.09.2023
Thomas24.04.2023
Axel Berse20.02.2023
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie