[Delphi multitache] Form, tache principale et handlers ...

Form, tache principale et handlers ... [Delphi multitache] - Delphi/Pascal - Programmation

Marsh Posté le 06-05-2003 à 17:27:00    

hello
 
j'ai un peu googlisé mais j'ai pas trouvé grand chose comme explications de "bases" sur le multitache windows sous delphi
 
d'abord, si j'ai bien tout compris, delphi met un disposition un objet TThread qui permet de ne pas avoir à utiliser d'API windows mais je ne comprends pas comment fonctionne la synchronisation entre plusieurs Threads: dans certains sites, j'ai lu qu'il fallait utiliser l'API windows, dans certaines sources, j'ai trouvé des "TSemaphore", par contre, pas de boites aux lettres en vue; bref, je nage un peu
 
si qqun a une adresse (francophone si possible, soyons fou) je suis preneur
 
:hello:


Message édité par trueslash le 13-05-2003 à 09:26:48
Reply

Marsh Posté le 06-05-2003 à 17:27:00   

Reply

Marsh Posté le 06-05-2003 à 18:51:09    

y a une procédure Synchronize à laquelle tu peux passer l'adresse d'une procédure à exécuter.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-05-2003 à 09:26:11    

bon, me revoilà avec mon problème de multitâche apres qq jours d'étude, voilà ce que j'ai :
 

  • une carte d'acquisition NI
  • un application multitâche delphi


l'acquisition se fait à l'aide de composants posés sur une form, cela signifie-t-il que les handlers de ses composants sont exécutés dans la tâche mère :??:
si oui, quelle est la priorité de la tâche mère :??:
toujours si oui, sachant que ses handlers attendent un jeton d'un sémaphore utilisé par une autre tâche de priorité tpHigher est ce que le fonctionnement est (comme je le suppose) bancal :??:
 
(apparement, l'application "loupe" des valeurs de temps en temps, c'est pour ça que je m'interroge ^^)
 
 
 

Reply

Marsh Posté le 13-05-2003 à 09:27:23    

antp a écrit :

y a une procédure Synchronize à laquelle tu peux passer l'adresse d'une procédure à exécuter.


 
merci bien, je vais essayer de voir ça dans la doc :jap:

Reply

Marsh Posté le 13-05-2003 à 09:34:29    

tes recherches sur google ont du te faire tomber sur ce tutorial en anglais je suppose mais je le donne pour ceux qui seraient intéressés

Reply

Marsh Posté le 13-05-2003 à 10:00:38    

Tu peux regarder [http://delphipage.free.fr/threads.html]ici[/url]

Reply

Marsh Posté le 13-05-2003 à 10:08:08    

merci bien, j'ai posté une copie de ce topic là bas [:joce]

Reply

Marsh Posté le 13-05-2003 à 10:08:54    

Oooops, dsl  :ange:

Reply

Marsh Posté le 13-05-2003 à 12:59:50    

:bounce:

Reply

Marsh Posté le 13-05-2003 à 14:48:05    

help, j'aimerais avoir une petite confirmation :cry:
 
est ce que les handlers des composants sont exécutés avec la même priorité que la tâche principale et est ce que la tâche principale a une priorité normale par défaut

Reply

Marsh Posté le 13-05-2003 à 14:48:05   

Reply

Marsh Posté le 13-05-2003 à 14:51:53    

je crois que c'est oui pour les deux questions


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-05-2003 à 16:10:03    

merchi :jap:
 
je vais essayer de faire un test avec des tâches différentes avec priorité plus forte, ça marchera peut être mieux :)

Reply

Marsh Posté le 14-05-2003 à 03:20:27    

trueslash a écrit :


est ce que les handlers des composants sont exécutés avec la même priorité que la tâche principale et est ce que la tâche principale a une priorité normale par défaut  


 
les handlers des composants  :??:  
 
Y a qu'un seul thread qui s'occupe des messages pour les composants, c'est le thread principal (d'ou le foirage total si on commence à modifier des compos visuels dans un autre thread). Tu peux modifier la priorité de ton thread avec SetThreadPriority et tu pourrais l'appliquer au thread principal, mais faut voir si l'utilisateur va apprécier  [:ddr555]  
 
Dans ton cas, je sais pas si c'est toi ou le compo qui qui vérifie si y a des trucs à lire sur la carte... si c'est toi (admettons que ce soit le cas) et que le compo que tu utilises n'est pas visuel (donc si c'est juste une icone sur un form en design time à priori c'est bon), crées le dynamiquement dans un thread, comme ca si ton application est "bloquée" a un truc plus ou moins important, tu peux tjs espérer que ton thread lise les infos de ta carte ;)  
 
J'espère que ca aidera au moins un peu  :sweat:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 14-05-2003 à 08:33:26    

ce que j'appelle "handler de composant", ce sont les procédure événementielles des composants :jap: (ça me fait penser à des handlers :/)
 
ce que j'aimerais faire, c'est que ces procédures, au lieu de se tapper tout le traitement, ne fasse qu'activer une tâche de priorité maximale qui elle ferait le traitement :/
 
je sais pas encore quel méthode de synchronisation utiliser: les sémaphores que j'ai vu ne servait qu'à ouvrir et fermer des sections critiques, je crois bien que je vais être obligé d'utiliser cette méthode synchronise à laquelle je comprends rien ^^ à moins que je trouve des méthodes pour endormir/réveiller des tâches

Reply

Marsh Posté le 14-05-2003 à 13:33:02    

T'as toujours pas été très explicite sur les compos, mais à priori pour une gestion d'un port ca doit pas être un compo visuel, tu peux très bien le créer et assigner les events dans un thread...


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 14-05-2003 à 14:00:04    

oui oui, c'est bien un compo non visuel :)

Reply

Marsh Posté le 14-05-2003 à 15:09:28    

ya un truc que je comprends pas trop avec la méthode synchronise :/
 
si j'ai bien compris, on appelle cette méthode quand depuis un thread on veut attendre la fin d'une procédure exécutée par le thread principal pour poursuivre l'exécution dudit thread
 
le probléme, c'est que je veux faire l'inverse (depuis le thread principale, s'arrêter tant qu'une tâche n'a pas terminé son traitement)
 
je crois que je vais choisir la méthode de Zion (créer les composants dans une tâche dédiée) :/

Reply

Marsh Posté le 14-05-2003 à 15:17:46    

trueslash a écrit :

ya un truc que je comprends pas trop avec la méthode synchronise :/
 


 
Benh si t'as compris, le principe de la méthode synchronize c'est d'envoyer un msg au thread principal avec l'adresse de la fonction à appeler (ce qui limite à des procédure sans arguments), et ce sera traité quand y aura plus rien à faire vu que le handler des messages (sauf si tu l'apelles toi même comme un bourrin) n'est apellé que quand on est sorti de toute imbrication de fonction dans le thread principal (pfiouf).
 
Donc oui, tu dois faire un thread, créer ton compo dans le thread et faire une boucle infinie dans le thread en apellant une fonction bloquante (genre une attente d'un mutex ou d'un event)...  
 
Enfin bon, tu vas t'amuser  [:banzai]


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 14-05-2003 à 15:33:47    

zion a écrit :


 
Benh si t'as compris, le principe de la méthode synchronize c'est d'envoyer un msg au thread principal avec l'adresse de la fonction à appeler (ce qui limite à des procédure sans arguments), et ce sera traité quand y aura plus rien à faire vu que le handler des messages (sauf si tu l'apelles toi même comme un bourrin) n'est apellé que quand on est sorti de toute imbrication de fonction dans le thread principal (pfiouf).


 
comme ça :??:
 

Code :
  1. Application.ProcessMessages


 
parce que yen a plein partout dans le code que je dois débugger [:joce]
 
j'ai une autre question, malgré mes recherches, je trouve de boites aux lettres .... comment je peux traduire boite aux lettre en anglais (à part mailbox et message queue) parce que google il trouve rien :cry:
 
Dans le cas où je trouverais vraiment rien, est ce que c'est raisonnable de créer une classe BaL avec un TObjectList protégé par un sémaphore :??:


Message édité par trueslash le 14-05-2003 à 15:35:10
Reply

Marsh Posté le 14-05-2003 à 15:55:01    


oué le ProcessMessages... Ca va le faire le synchronize direct la  et adieu monde cruel parfois [:ddr555]  
 
Pour le sémaphore, faut voir, tant que tu risques pas d'avoir 2 threads qui se bloquent l'un l'autre ca va  :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 14-05-2003 à 16:03:21    

bon, j'en ai marre de pinailler à chercher les bugs
 
je vais refaire du code qui marche  :o
 
merci pour ton aide


Message édité par trueslash le 14-05-2003 à 16:03:35
Reply

Marsh Posté le 15-05-2003 à 09:12:56    

hello
 
si je crée un composant non visuel dans une tâche, qu'est ce que je mets dans le paramètre AOwner de son constructeur :??:

Reply

Marsh Posté le 15-05-2003 à 10:01:18    

si tu le libères manuellement après, tu peux mettre nil
si tu mets Application ou le nom de la Form peut-être qu'elle se charge de le virer mais j'en suis pas sûr (faut peut-être aussi le parent ?)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 16-05-2003 à 13:27:03    

TMultiReadExclusiveWriteSynchronizer
 
:heink:
 
 
pourquoi pas
 
TMultiReadExclusiveWriteSynchronizerSoThatSeveralThreadsCanReadAsLongAsNoOneIsWrinting
 
:/
 
antp:
finalement, j'y ai mis sur une forme, je verrai plus tard si je les met dans le thread :)


Message édité par trueslash le 16-05-2003 à 13:27:54
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed