| |
|
|
Jens-Arne Reumschüssel | Guten soir,
je suis aujourd'hui chez Durchsicht des XProfan-Managers de Dietmar Horn sur qui Fil.pcu-Unit de iF gestoßen. avec cette peux on jusque quatre "Threads" dans einem XProfan-Programme courir laisser, qui angeblich cela Hauptprogramm prozessortechnisch pas belasten. cela hat naturellement mon curiosité geweckt - j'ai mich gefragt, comment zum Teufel il wohl gemacht hat. Multithreading allez oui bekanntlich avec XProfan pas. Pour einiger Zeit suis je sur qui concept gekommen, dass cela wohl sur Minuteur fonctionne, qui Windows z.B. aussi ensuite aufruft, si cela Hauptprogramm justement im WaitInput steckt. il y a chez qui SetTimer-API-Funktion nämlich qui Possibilité, une Callback-Routine einzubinden. et so ist es sûrement aussi, comment bestimmte Tests montrer. car c'est naturellement ne...aucune réel Multithreading, mais au cours de qui Abarbeitung qui Minuteur-Routinen ist cela Hauptprogramm blockiert. il peut alors pas wirklich behaupten, dass es prozessortechnisch pas belastet serait. quand même aller avec cela très interessante Dinge, qui ablaufen peut, au cours de cela Hauptprogramm sur Eingaben wartet.
j'ai cela interessehalber la fois nachgebaut:
$H windows.ph
Déclarer _aProc%,_aProc2%,_hTimer%,_hTimer2%,_hTimer3%,_hT%,_hT2%,_Count%,_Count2%,_Ende%
PROC TimerProc
'unnamedParam3&=Timer-Handle, avec cela peux on entre den individuel Timern unterscheiden (qui Parameterbezeichnung stammt de Microsoft, nähere Erläuterungen gibt es en supplément im MSDN pas)
'attention: Au cours de qui Abarbeitung eines TimerProc-Aufrufes fonctionne cela Hauptprogramm pas plus! Es handelt es sich plan pas um réel Multithreading. Daher seulement kurze Codes verwenden.
Paramètres unnamedParam1&,unnamedParam2&,unnamedParam3&,unnamedParam4&
Si unnamedParam3&=_hTimer%
Imprimer "Timer 1 aufgerufen"
ElseIf unnamedParam3&=_hTimer2%
Imprimer "Timer 2 aufgerufen"
EndIf
ENDPROC'TimerProc
PROC DoSomethingFast
Paramètres unnamedParam1&,unnamedParam2&,unnamedParam3&,unnamedParam4&
Inc _Count%
SetText _hT2%,"Timer 3: "+@Str$(_Count%)
ENDPROC'DoSomethingFast
Cls
Imprimer "Programmende avec Escape"
Imprimer
_hT%=@Créer("TEXT",%Hwnd,"Hauptprogramm: 0",250,10,160,20)
_hT2%=@Créer("TEXT",%Hwnd,"Timer 3: 0",250,35,160,20)
_aProc%=@ProcAddr("TimerProc",4)'Funktionsadresse qui TimerProc ermitteln
_aProc2%=@ProcAddr("DoSomethingFast",4)
'Minuteur 1 erzeugen
'paramètre 1 & 2 doit 0 son, 3 ist qui Wartezeit jusqu'à zum prochain Aufruf dans Millisekunden, 4 ist qui Adresse qui TimerProc.
'attention: qui Aufrufzeit darf sich pas avec einer vorhergehenden Bearbeitung qui TimerProc überschneiden, vous muss alors long genug gewählt son, sodass qui TimerProc avant dem prochain Aufruf fertig wird!
'il peut naturellement pour verschiedene Minuteur différent Procs verwenden, solange es freie @ProcAddr-Plätze gibt. ensuite ist cela Überschneidungsproblem pas entier aussi grand.
'Aussi pourrait on beim Einsatz de JRPC3 schnelle native Procs verwenden, qui ne...aucune réel Zeitproblem erzeugen. ca serait aussi qui Beschränkung qui freien @ProcAddr-Plätze beseitigen.
_hTimer%=~SetTimer(0,0,1000,_aProc%)
'attendre, avec cela es une fühlbaren Zeitunterschied dans den Aufrufen qui Minuteur gibt
Sleep 300
'Minuteur 2 erzeugen
_hTimer2%=~SetTimer(0,0,1000,_aProc%)
'Minuteur 3 erzeugen (plus rapide Aufruf)
'qui zeitliche Auflösung des Windows-Timers ist ca. 16ms; 10 garantiert daher den schnellstmöglichen Aufruf des Timers.
'c'est mais toujours très lente im comparaison trop echtem Multithreading, là so maximum bien 60 Aufrufe pro seconde possible sommes - pour viele interessante Dinge pourrait cela quand même ausreichen.
_hTimer3%=~SetTimer(0,0,10,_aProc2%)
Utilisateur Messages $10'Programmende
_Ende%=0
WhileNot _Ende%
'qui Minuteur courir indépendant et volonté de Windows aussi au cours de des WaitInputs aufgerufen, ils sont alors indépendant de qui Haupteingabeschleife des Hauptprogramms.
'Au cours de Sleep volonté qui Minuteur allerdings pas abgearbeitet, cela wirkt évident Profan-Programme-large.
WaitInput 250
Si (@iskey(27) and (~GetForegroundWindow()=%HWnd)) Or (%UMessage=$10)
_Ende%=1
Endif
Inc _Count2%
SetText _hT%,"Hauptprogramm: "+@Str$(_Count2%)
Endwhile
~KillTimer(0,_hTimer%)
~KillTimer(0,_hTimer2%)
~KillTimer(0,_hTimer3%)
Fin
Um mon These trop belegen, dass cela Hauptprogramm par qui TimerProc blockiert wird, peux on simple la fois une longtemps Boucle (for i%,0,100000) dans cet einbauen. Au cours de vous abgearbeitet wird, wird qui Hauptprogramm-Zähler pas aktualisiert. c'est chez Nutzung qui Unit genauso.
Beste Grüße, Jens-Arne |
|
|
| XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 10.07.2023 ▲ |
|
|
|
|
p.specht
| si on qui Threads sur verschiedenen Prozessorkernen eines zB Quadcores zum courir apporter peux, devrait doch un Performance-Gewinn trop erreichen son. Windows läßt meines WIssens entsprechende Programmbefehle seulement comme "Empfehlungen" trop, qui l'affaire ist de allen anderen konkurrierenden Prozessen im System dépendant. (avec Vorbehalt: mon Hirn ist dans dernier Zeit là malheureusement pas très zuverlässig) |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 10.07.2023 ▲ |
|
|
|
|
Jens-Arne Reumschüssel | ce sont oui aucun echten Treads. c'est pourquoi courir vous toujours sur dem Kern, qui dem XProfan-Programme zugewiesen ist. cela XProfan-Programme verzweigt sozusagen zur TimerProc, si qui Minuteur ca auslöst. quand même finde je cela vraie "cool", si je cela einmal so dire darf. sur quoi on pas toujours wieder stößt, si on qui idées qui alten Grandseigneurs unserer grandiosen Discours durchforstet! |
|
|
| XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 10.07.2023 ▲ |
|
|
|
|
Jens-Arne Reumschüssel | Im opposition en supplément volonté echte Threads réellement automatisch sur allen Kernen fonctionnement, si on cela pas künstlich verhindert. un Beispiel ist mon Apfelmännchenprogramm im JRPC3-partie cet Forums. Pour cette braucht on mais Code, qui multithreadingfähig ist - cela allez dans XProfan pas sans Hilfsmittel, mais pour nécessaire on z.B. FreeBasic ou bien PureBasic (tu sais déjà, fbProcs et pbProcs dans JRPC3 ). |
|
|
| XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 10.07.2023 ▲ |
|
|
|