Accueil > Forum > > > > Thread ?
Thread ?
mardi 1 mai 2007 à 16:11:06 |
Thread ?

DeltaFX
|
Hi dudes,
Voila, jusqu'à présent, j'avais pas besoin de threader, donc je me posais pas énormémemnt de questions sur le sujet... et là... je me trouve confronté à la necessité de threader.
C'est plus une obligation morale qu'un impératif, en fait. Vue la future plateforme cible pour le prog (Epia DP310) je me dis qu'en threadant au max ce qui peut l'être, ca va équilibrer la charge sur les procs, donc c'est plus propre, sachant que sur une EpiaDP310 (biproc), ceux-ci ne sont pas des foudre de guerre. Qui peut le plus pouvant le moins, ca tournera encore mieux sur un core2duo....
Une form est-elle une entité threadée à la base ? Je veux dire, si je crée un prog avec N forms permanentes, ai-je N threads ipso facto ?
J'ai lu le tuto ici également, auriez-vous des liens vers d'autres tutos ?
Merci d'avance.
|
|
mardi 1 mai 2007 à 16:32:03 |
Re : Thread ?

florenth
|
Salut,
Pour répondre à ta question, non, tu n'auras pas autant de threads que de forms. Pour une simple raison: toutes les fiches doivent tourner dans le thread principal, sinon Delphi gère mal les messages Windows et c'est la galère.
D'ailleurs, je ne sais même pas si c'est possible avec d'autres langages.
Tu n'auras donc qu'un thread peu importe le nombre de fiches. Par contre, si tu veux effectuer plusieurs choses à la fois, tu vas devoir "threader", càd créer un dérivé de TThread et effectuer les actions dedans.
Attention cependant: contrairement à une application mono-thread, tu vas devoir te préocuper de synchronisations entre tes nouveaux threads et le thread principal (pour le mise à jour de la fiche par exemple) car tu ne peux pas avoir plusieurs threads qui utilisent le même espace mémoire en même temps.
En gros: les threads, c'est du gros. Mais ne crois pas pour autant que tout va devenir plus rapide.
++ Flo
|
|
mercredi 2 mai 2007 à 09:52:39 |
Re : Thread ?

Loda
|
salut,
les thread ont deux principaux avantages: - faire en "background" les calculs long, sans bloquer l'interface utilisateur. - pour les communication réseau (écoute de port, ...)
pour pouvoir "threader" un truc, ce doit être un minimum indépendant. tu ne peux pas thread une fiche de ton prog prise plus ou moins au hasard. Les thread sont intéressant seulement si la function est très indépendante. plus tu doit synchroniser, moins c'est intéressant niveau perf. note que créer un thread n'est pas gratuit. ça coute du temps et des ressource. De manière général, un thread transformera des donnée. (tableau à tableau, param à bitmap, ..)
je confirme, ne manipule pas de fiche dans des threads. ceci inclue les dialog. (ie: pour afficher une message depuis un thread, tu doit envoyer le texte à ton thread principale qui. lui, l'affichera. sinon c'est la merde, t'as des dlg au taille fantaisistes et autre problème similaires.)
note aussi que la prog parallèle est presque une science à part. Aussi le débug de thread est très très difficile. (et delphi support très mal les break point dans les thread). Aussi, il est souvent impossible de reproduire une erreur liée au thread (AV, ..).
les thread en Delphi functionne sur le même principe que dans d'autre language. cherche des tuto sur le net !
bon thread !
Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
|
|
mercredi 2 mai 2007 à 13:04:17 |
Re : Thread ?

florenth
|
"et delphi support très mal les break point dans les thread" => C'est vraiment galère d'ailleurs. Heureusement, dans TurboDelphi, ça va déjà bien mieux mais c'est pas encore ça ...
|
|
mercredi 2 mai 2007 à 18:26:37 |
Re : Thread ?

DeltaFX
|
Merci. Je me doute que c'est du gros, et c'est d'ailleurs ce qui m'interresse : une partie du code (ce que je pense threader) doit discuter avec le hardware en permanence (carte interface) + systeme de positionnement=> fusion de capteur. Donc sur le papier je me retrouve avec a priori N Thread pour zieuter les différent hardwares (et tagguer les données par un timestamp) et un N+1ieme thread qui lui me fera un kalman du bigntz, et remontera les infos fusionnées dans le prog principal. Chacun avec des echelles de temps différentes, donc forcement des barrieres de synchro. Sous nunux je me torturerais moins, je m'interresserais direct a javaRT, mais...... c'est du zindoz, j'ai pas le choix.
Florenth, c'est quoi un breakpoint ?
|
|
mercredi 2 mai 2007 à 19:13:05 |
Re : Thread ?

WhiteHippo
|
Bonsoir
Et pourquoi pas tout simplement deux programmes (et donc deux threads) : Le principal et un secondaire chargé de la communication avec tous tes cartes d'interface. Le programme principal accédera aux données lues par le programme de communication via un filemapping. Quoi de plus simple ??
N.B. Tu pourras par ailleurs modifier la priorité du programme de communication.
P.S. "N Thread pour zieuter les différent hardwares" Ce n'est pas une bonne solution que de multiplier les threads !!
Cordialement.
"L'imagination est plus importante que le savoir." Albert Einstein
|
|
mercredi 2 mai 2007 à 21:00:59 |
Re : Thread ?

florenth
|
Le breakpoint, c'est quand tu cliques dnas la marge de l'éditeur: la ligne sélectionée apparait en rouge (sauf si tu as changé la couleur) et quand l'instruction surlignée est executée, Delpih passe en mode pas-à-pas et donc tu utilises F8 et/ou F7 pour avancer dans le programme.
C'est très pratique pour débugger, surtot que tu peux créer des points de suivi pour vérifier que les différentes variables de ton application ont bien la bonne valeur au bon moment ...
Mais dans les threads, il as$rrive que ça plante ... snif !
|
|
mercredi 2 mai 2007 à 21:55:09 |
Re : Thread ?

DeltaFX
|
Whitehippo : oui, j'y ai pensé mais alors je me heurte a un problème de communication. Quand le pc se met en veille profonde (s3 ou S4) sur une décision de mon appli, pour parer au aléa windozien (genre pas de redétection des periphs usb à la sortie de veille) avant de s'endormir j'execute dans chacune des forms de l'appli une fonction PrepareToSleep qui selon le cas va se déconnecter des cartes et hubs USB, fermer les ports série,tout ça. Si je splitte l'applic avec une communication par segment mémoire partagé, ca va être la mort pour avoir un truc réactif, et là le débug serait bien plus ardu (peut-on avoir 2 progs qui tournent en meme temps dans l'IDE, et pouvoir surveiller les deux en meme temps ? )
Je sais que zindoz limite a 16 le nb de thread, mais je ne compte pas en avoir plus de 3 en tout, grand maximum.
Quand au débug, je le ferai peut-etre pas en live, mais en ayant une log pour chaque thread, avec des timestamp. L'important est que quand le code de fusion des données tourne pour recalculer une position/vitesse estimée fiable, il doit intégrer :
- les n données des accéléromètres stockées pendant 1 seconde à 20Hz
- les m donnée des capteurs de rotation des chenilles pendant 1 seconde a 15 Hz ainsi que les clinomètres à la meme fréquence
et donc vider les buffers des threads en question. Je suis parti pour utiliser des verrous.
|
|
mercredi 2 mai 2007 à 22:31:35 |
Re : Thread ?

WhiteHippo
|
"Si je splitte l'applic avec une communication par segment mémoire partagé, ca va être la mort pour avoir un truc réactif..." C'est à dire ??? En vitesse de traitement ou bien en maintenance à long terme ?
"le débug serait bien plus ardu" : Faux car une fois ton appli de communication développée tu ne t'en occupes plus. Elle se résumera alors à un programme qui stockera des données dans une zone mémoire. Et tu pourras te concentrer sur le programme principal et le traitement des dites données.
"peut-on avoir 2 progs qui tournent en meme temps dans l'IDE, et pouvoir surveiller les deux en meme temps ?" Si tu lances le programme de communication à partir du programme principal, celui ci sera "vu" comme un processus engendré et donc tu pourras le deboguer (si option cochée dans les options du débogueur)
Cordialement.
"L'imagination est plus importante que le savoir." Albert Einstein
|
|
jeudi 3 mai 2007 à 09:30:07 |
Re : Thread ?

Loda
|
Réponse acceptée !
re,
"deux programmes (et donc deux threads)" dsl, mais deux programme c'est deux process. et ça me semble plus simple de faire deux thread que deux process. C'est intéressant de faire deux PROCESS (application) si tu n'as pas besoin de l'affichage en premanance. tu laisse le process d'acquisition et de traitement tourner, et tu ne charge l'affichage que lors tu en as besoin. (et l'affichage vas lire un memorymap ou équivalent). C'est le même genre de system que pour configurer des services.
WhiteHippo a raison, tu gagne avec les thread si t'en a un nombre raisonnable. Si t'en a bcp, tu perd!
"je ne compte pas en avoir plus de 3 en tout, grand maximum." : très bien. N'oublie pas de regler les priorité ! Tu peux en avoir 4: genre un pour les acquisition lente, un pour les rapide, un pour les calculs sur les acquisition et le principal (affichage). Si els calculs sont rapide, tu peux les faire dans le thread d'acquisition. (n'oublie pas que windows n'est PAS déterministe) sit u as besoisnd e rendre windows déterministe (ie: pour du Real time) il existe des trucs. (j'avais fait des recherche la dessus pour mon travail de diplôme. demande moi si jamais)
POur le debug, Tu peux faire une version avec un seul thread (ie: sans thread) qui fait une seul choses. En premier, disons l'acquisition, puis une fois qu'il marche bien, de faire le reste. Pour aller loin, il faut y aller par étape. (mais je pense que tu le sais déjà, non?)
Tu m'as l'aire d'avoir toute les chances de très bien t'en sortir. (Debug par log, se documenter avant de commencer, ...)
Un ou deux trucs: -dérive la class TTHread de base pour ajouter des fct de debug/log
- nomme tes thread pour le debug. (ajout un champs fThreadName) {$IFDEF DEBUG} type TThreadNameInfo = record FType: LongWord; // must be 0x1000 FName: PChar; // pointer to name (in user address space) FThreadID: LongWord; // thread ID (-1 indicates caller thread) FFlags: LongWord; // reserved for future use, must be zero end;
procedure SetName(const Name:String); var ThreadNameInfo: TThreadNameInfo; begin ThreadNameInfo.FType := $1000; ThreadNameInfo.FName := PAnsiChar(@name[1]); ThreadNameInfo.FThreadID := $FFFFFFFF; ThreadNameInfo.FFlags := 0; try RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo); except end; end; {$ENDIF}
procedure TMonCustomThread.Execute; begin inherited;
{$IFDEF DEBUG} SetName(fThreadName); {$ENDIF} end;
pour catcher les exception dans un thread:
procedure TMonCustomThread.DoTerminate; (override) begin inherited;
if Assigned(FatalException) then My_ProcessUnhandeledException(self,FatalException as Exception); // tu peux faire la meme choses dans le event OnTerminate. mais pour une class de base... end;
Si t'as des problèmes pratiques, demandes nous.
bon code,
Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
|
|
Cette discussion est classée dans : prog, thread, threader
Répondre à ce message
Sujets en rapport avec ce message
programmation port serie help ! [ par james ]
Bonjours a tous !Je cherche une procedure en assembleur(j'y connait rien) et a incorporer dans un prog delphi , pour pour intercepter les signaux envo
acces au port serie ? [ par james ]
Bonjours a tous !Je cherche une procedure en assembleur(j'y connait rien) et a incorporer dans un prog delphi , pour pour intercepter les signaux envo
equation [ par koko ]
Je voudrais que mon prog puisse résoudre un équation du genre : on a 2 pt, avec leurs coordonnées imaginons le pt A et BA (1,2) B(3,1). Il existe une
Récup de Prog Clipper [ par mjmep ]
Un ami a une petit boite. il gère ses comptes avec un prog datant de mathusalem écrit en clipper 5.2. avant de décompiler l'exe (cela coûte plus de 60
Comment écrire une valeur en hexa dans un prog delphi [ par Manthis ]
Salut,Je voudrais savoir comment écrire une valeur hexadécimale dans mon prog.Merci
complément w32dasm [ par eedy31 ]
salut a tous!Voilà, mon 1er petit prog(tt petit..)!j'y ai galéré mais j'y sui arivé!!bon alors keskil fé ce prog?hein?Ben c tout simplement une sorte
complément w32dasm [ par eedy31 ]
salut a tous!Voilà, mon 1er petit prog(tt petit..)!j'y ai galéré mais j'y sui arivé!!bon alors keskil fé ce prog?hein?Ben c tout simplement une sorte
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
Comment fermer un Service ou un prog? [ par Manthis ]
Salut,Je voudrais savoir comment fermer un programme et un service dont je connais le nom de l'exe.Normalement les deux sont diffférents alors si qqn
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Hero
Entre 550€ et 550€
|