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

Delphi

 > 

Système

 > 

Exécution

 > 

Thread ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Membre Club
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

Membre Club
"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

Membre Club
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

Membre Club
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

Membre Club

"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

Membre Club
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.

1 2 3

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


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

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 : 5,288 sec (4)

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