begin process at 2010 02 10 08:35:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Exécution

 > LES FIBERS : DES THREADS NON PRÉEMPTÉS PAR LE SYSTÈME

LES FIBERS : DES THREADS NON PRÉEMPTÉS PAR LE SYSTÈME


 Information sur la source

Note :
9,75 / 10 - par 4 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Exécution Classé sous :Thread, Fiber, BeginThread, ConvertThreadToFiber, CreateFiber Niveau :Initié Date de création :01/03/2009 Vu / téléchargé :1 650 / 264

Auteur : Caribensila

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Les Fibers sont des sortes de Threads allégés, ou plutôt simplifiés. Ils ne sont pas identifiés comme Threads par le système d'exploitation et ne sont donc pas préemptés. C'est à vous de jouer le rôle du scheduler de windows et de prévoir un traitement de planification. Cela peut vous laisser plus de liberté et plus de souplesse qu'avec des Threads.

Voici donc une petite démo d'initiation aux Fibers qui vous permettra de faire vos propres expériences.
Vous y trouverez une unité qui vous sera utile à chaque fois que vous voudrez développer avec cette technique. En effet, les Fibers ne sont pas repris dans Delphi. Ils ne sont de ce fait pas documentés non plus. C'est pour cette raison que j'ai écrit un petit tuto que vous trouverez dans la rubrique "Tutoriels" de CodeSSourceS.

Bonne découverte !


 Conclusion

Delphi7, testé uniquement sur Windows XP

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip SCANNER ALEATOIREMENT TOUS LES PIXELS D'UN BITMAP
Source avec Zip Source avec une capture TEXTE GRAPHIQUE AVEC "VRAIE" OMBRE.
Source avec Zip CALCULER LES PERFORMANCES DES THREADS
Source avec Zip Source avec une capture MATCHESMASK ET LES EXPRESSIONS RÉGULIÈRES.
Source avec Zip Source avec une capture TRAITEMENT DE TRAITEMENTS LONGS.

 Sources de la même categorie

Source avec Zip GÉNÉRATEUR DE JET DE DÉS par koriteki
Source avec Zip Source avec une capture UAC (USER ACCOUNT CONTROL) - EXÉCUTER UNE APPLICATION EN TAN... par ni69
BLOQUER LE TASKMGR SANS CLÉ DE REGISTRE par craftsystem
Source avec Zip UTILISER LES MESSAGES WINDOWS POUR GERER LE NOMBRE D'INSTANC... par lotfi213_b19
Source avec Zip Source avec une capture SIMOBROWSER par simo5963

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture THREAD ET BITMAP (DESSIN AU CRAYON) par barbichette
Source avec Zip Source avec une capture PRÉ-COMPOSANT D'AFFICHAGE DE TEXTE PROGRESSIF... par blueperfect
Source avec Zip Source avec une capture ANIMATION AVEC PNG par Bacterius
Source avec Zip DES THREADS EN 1 CLIN D'OEIL ! par Bacterius
Source avec Zip Source avec une capture ANIMATIONS [SCANLINE + ALGÈBRE] par Bacterius

Commentaires et avis

Commentaire de cirec le 01/03/2009 18:01:36 administrateur CS 10/10

c'est a l'air génial ces Fibers

et avec très peut de code .. Bravo et merci de partager cela avec nous ;)

j'ai pas encore analyser le code et j'ai juste parcouru le tuto en diagonale (il n'est toujours pas activé mais tu dois le savoir) mais ça ne saurait tarder.

Mais le principe me plait, j'avais jamais entendu parler de ça !!! comme quoi ... :D

rien que pour ça et les possibilités ainsi que la souplesse qu'offre cette méthode je mets un 10/10

Commentaire de Bacterius le 01/03/2009 20:29:57

Woah très interessant !

Mais je vois que Borland s'est arrêté en milieu de chemin, puisqu'il a quand-même déclaré quelques constantes relatives aux Fibers dans l'unité Windows.
Par contre il faudra m'expliquer pour les fonctions assembleur ...

Je mets 10/10, même si un anti-aliasing sur le cercle n'aurait pas été de refus ;)
Je vais probablement faire quelque chose avec ces choses-là bientôt ... une classe TFiber, puis un composant TFiberComponent ?
Déjà je vais lire le code dès que possible (c'est la fin des vacances ...), pour voir comment ça fonctionne :)

Cordialement, Bacterius !

Commentaire de Bacterius le 01/03/2009 20:30:12 10/10

Oups la note désolé ^^

Cordialement, Bacterius !

Commentaire de Loda le 02/03/2009 09:27:58

ça fait plaisir de voir un code technique sur un sujet intéressant !

j'ignorais que ce concept était supporté/impléementer par windows! (j'avais déjà utilisé qqch de similaire, mais c'était implémenté "a la main")

continue le bon code!

Loda

Commentaire de Francky23012301 le 02/03/2009 13:48:13 9/10

Débiars en révait , Cari l'a fait :  un jeu sur Fibers le dauphin :p.

En tout cas merci d'avoir rajouté un poisson dans l'aquarium de mes pauvres connaissances : j'ai appris un truc donc j'ignorais l'existence.

Juste deux petits bémols :
*renomme tes composants et des ptits commentaires pour la compréhension de l'asm j'en veux bien ;) (Hihi je sais je suis chiant ;) ).
*A quand une classe TFiber un peu à la sauce TThread ;) ? Tu nous laisses sur notre faim/fin.

Bon allez pour le poiscaille je colle un 9/10 (A cause de l'arrette :p ).

Commentaire de Caribensila le 02/03/2009 16:41:25

<aparté>
- Tiens, t'es revenu Francky?
- T'étais où?
- Je parie que tu reviens de Fécamps... Une campagne de pêche à la morue, non?  mdr
<aparté>

Merci pour vos commentaires, les gars.
Vous mettez le doigt sur le truc qui m'a longtemps fait hésiter à poster ce source : l'unité Fibers en asm qui permet d'utiliser cette technique sous Delphi.
Elle n'est, bien sûr, pas de moi (c'est pas de mon niveau!). Je l'ai trouvée ainsi, brute de décoffrage.
J'avoue que j'ai essayé de la comprendre... en vain. Me suis même plongé une journée dans l'assembleur; j'ai failli m'y noyer et y rester. C'est plus de mon age, ce truc! Bref, je me suis décidé à poster le truc comme ça. En espérant qu'une 'grosse pointure' du site apportera la lumière à ma lanterne.
De toute façon, avec la POO, on prend l'habitude d'utiliser des concepts qui nous échappent un peu. C'est un peu le but, même si c'est parfois frustrant. Et, d'autre part, c'est aussi un peu le concept de ce site : progresser grâce à l'aide des membres plus "avancés".
Voilà donc les raisons pour lesquelles vous allez pouvoir attendre longtemps mes commentaires sur les quelques lignes de Fibers.pas. Ca ne viendra pas de moi et j'en suis désolé.

Quand à l'intérêt des Fibers, après avoir été emballé au début, comme semble aussi l'être Cirec, je me pose encore des questions et j'aimerais bien voir une application exploiter à fond ce concept et en démontrer la pertinence. C'est peut-être pas un hasard si cette technique est si mal connue et documentée. Je n'en ai en effet encore jamais rencontrées et, encore une fois, j'espère qu'une 'grosse pointure' aura du feu pour ma lanterne.

En tout cas, on sait tous que ça existe, maintenant. Reste plus qu'à en tirer la "quinte essence"...

Commentaire de rt15 le 09/03/2009 12:32:26 administrateur CS 10/10

Je rejoins les félicitations générales. Très belle source. Originale, qui peut aider ceux qui veulent faire des fibers... Du grand art.

En attendant une grosse pointure que je ne suis pas, je peux essayer de donner un début d'explication concernant les quelques lignes d'assembleur. Soit dit en passant l'assembleur est infiniment plus simple que le Delphi sur le plan syntaxique : il y a vraiment pas beaucoup d'instructions et elles sont toutes relativement simples. C'est pas du tout un langage qu'il faut considéré comme inabordable et réservé à je ne sais quels bidouilleurs de l'extrème.

Le processeur est composé d'un certain nombre de registres, c'est à dire de cases nommées pouvant contenir des valeurs.

Quand le windows décide de changer le thread en cours d'exécution, il remplace les valeurs stockées dans ces registres par celles du thread à exécuter.

On appelle ça des contexte d'exécution. Windows garde en mémoire le contexte de tous les threads et remplace un contexte par un autre pour changer de thread.

Dans un processus, tous les threads ont accès à la même mémoire.

Donc si un processus a un thread A et un thread B, comment faire la différence entre les deux ?

En sockant dans le contexte des informations sur le thread courant.

A chaque changement de thread, le contexte étant mis à jour, les informations sur le thread sont mises à jour.

Le processus peut ainsi facilement connaître son thread qui est en cours d'exécution.

GetCurrentThreadId par exemple, exploite probablement les informations de contexte pour renvoyer l'id du thread.

Où sont stockées ses informations dans le contexte ?

Le contexte, composé de registre, est de taille très restreinte pour des raisons de performance évidente.

Le contexte est donc stocké en mémoire et pointée par un des registres, fs.

Chaque thread a donc son propre fs qui pointe sur son propre contexte, le TEB, pour Thread Environment Block :
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html

Le TEB permet de récupérer beaucoup d'informations sur le thread et le processus :
Il y a un pointeur sur le Process Environment Block, les IDs du thread et du processus (Dans RealClientId)...

Et un pointeur sur les infos sur la fibre.

Le pointeur sur ces infos se trouve dans la Tib, la première structure du TEB.

Le TEB est bien représentée sur wikipedia (Ils appellent ça le TIB, mais le TIB est seulement la première partie), avec les offset :
http://en.wikipedia.org/wiki/Win32_Thread_Information_Block

On voit que "Fiber data" se trouve à l'offset de la TEB/TIB + 0x10 = 16 = $10 octets.

C'est ça que va chercher l'assembleur.

function GetCurrentFiber : Pointer;
  asm
    mov eax, fs:[$10]
end;

La valeur de retour de la fonction doit être mise en place dans le registre eax.
Donc il faut déplacer Fiber data dans eax :
mov eax, FiberData

fs est un registre de segment. Les registres de segments permettent de modifier l'adressage. Par défaut, pour une instruction, c'est le registre de segment ds qui est utilisé. mov eax, [$10] est équivalent à mov eax, ds:[$10].

Ici, on veut accèder au TEB et on sait que fs pointe dessus, du moins que l'adresse 0 dans le segment fs correspond à l'adresse du TEB. On précise donc que l'on utilise le registre de segment fs.

Et on tape à l'adresse $10 de ce segment. Détail "amusant", pour ce segment, nil n'est pas du tout une adresse invalide.

Dans le cas de la deuxième fonction :

function GetFiberData : Pointer;
  asm
    mov eax, fs:[$10]
    mov eax, [eax]
end;

On récupère le premier champ de la structure pointé par Fiber Data. Mais je n'ai pas trouvé la définition de la structure en question.

J'espère avoir été au moins vaguement compréhensible...

Commentaire de DeltaFX le 09/03/2009 15:54:26

Pas préempté par le system ? Gnh ?

Ce qui veut dire que si je crée (admettons que ) un scheduler de Fibres qui soit lui meme un Fiber et que je l'appelle mettons Round-Robin (par exemple) je peux faire du temps réel Hard sous zindowz ? *start droolin' on my keyboard*

pour de vrai ?


Commentaire de rt15 le 09/03/2009 16:07:21 administrateur CS

Non, malheureusement ce n'est plus la saison du père noël. Windows schedule les threads. Les threads schedulent les fibers.

http://msdn.microsoft.com/en-us/library/ms682661(VS.85).aspx

Commentaire de Loda le 10/03/2009 12:34:04

@DeltaFX:

les Fibers seulement te permet qu'un autres Fibers (thread) de TON application ne préempte pas TON Fiber (thread) courant. Ce qui limite les problèmes de multi-thread (lock,...)

si tu veux faire tu RT sous windows.... humm. windows n'est pas RT, mais tu peux regarder du côté de solution commercial "windows compatible" comme rtos32.
http://www.on-time.com/rtos-32.htm

Avec RTOS32, C'est très facile de faire tourner une application Delphi "normal" pour du RT embarqué. (Il propose un ordonnancement digne d'un OS RT, ...)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

boucle thread simple exemple ! [ par fabiin ] Salut !Je cherche un exemple simple d'une boucle threadje n'est trouvé aucun tutorial français a ce sujet sur internet Merci par avance@+Fabs Problème avec Canvas.draw [ par fabiin ] salut,voici mon prob:j'utilise un threaddans ce thread dans ce thread je dessine sur un TBitmap(jusque la pas de problème)ensuite, je veu afficher mon Arrêt d'un thread [ par commodore ] J'aimerai savoir s'il existe une une variante que ExitThread pour arréter un thread . Car je voudrais arréter un thread d'un a partir d'un BT arrét et Urgent, cherche aide sur le multi-thread [ par djtexas ] Pour commencer, j'ai programmé un serveur chat sans grande prétention, mais me voila confronté a un problème de stabilité du moteur. J'utilise 2 compo parametrer un thread [ par optarel ] j'aimerais passer un parametre à la fonction thread.execute.or celle-ci n'est jamais appellée explicitement, c'est quand on lance thread.create qu'ell thread ou pas thread ?????? [ par xklibur ] hello,ben voila, je sais pas quo faireEn fait j'ai un formulaire avec des boutons (woaw)et quand je clique sur un bouton, ca doit ouvrir un autre form Comment dialoguer entre deux threads [ par nicolaspennaneach ] Voilà, j'ai deux threads. Un gère les entrées claviers et l'autre gère la connection à une machine distante en telnet.Ce que je souhaiterai savoir c'e Fin d'un thread [ par DropF ] Bonjour,j'aimerais effectuer une action à la fin de l'exécution d'un thread. Je sais qu'il il a l'évènement OnTerminate pour les TThread, mais je ne s Thread [ par ryadus ] Salut;est-ce quelqu'un pourrez m'exliquer ce que signifie Thread, avec des exemples si posiiblesmerci Un thread sans ralenti SVP :) [ par fabiin ] salut,Voila, J'ai un thread secondaire qui tourne sans problème...Dans la fonction execute j'utilise une boucle,...(qui tourne donc en arrière plan)Or


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales