IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Réactivité d'une application


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut Réactivité d'une application
    Bonjour,

    J'ai développé une application dans laquelle les opération "longues" sont exécutées dans des threads. L'application peut alors réagir aux sollicitations de l'utilisateur malgré le traitement en cours.

    Pour des raisons pour lesquels il n'est pas la peine de s'étendre, je me demande si j'aurais pas pu faire le contraire. Je veux dire, garder le traitement des opérations longues synchrone et faire un seul thread qui s'occupe de faire "vivre" l'IHM (à priori via un synchronize puisque la VCL n'est pas thread safe). Cette solution permettrait un codage beaucoup plus simple des traitements (si j'envisage un thread/traitement il faut faire des dizaines de classes dérivées de TThread avec toute la lourdeur des mises à jour de l'IHM, sans parler du casse-tête des cas d'erreur)

    Avant de partir dans l'essai de cette solution, j'aurais aimé avoir vos avis éclairés sur la question (possible/pas possible, avantages/inconvénients, ça va pas la tête, etc....

  2. #2
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Bonjour,

    Il y a un point que je n'ai pas compris. D'un côté tu as 1 thread principal pour ton IHM et n traitements qui se lance dans des threads (1 thread / traitement). De l'autre côté, tu dis pouvoir faire la même chose avec 1 thread principal pour tous tes traitements, et 1 thread secondaire pour l'IHM.

    Pourquoi d'un côté 1 traitement / thread et de l'autre 1 thread pour tous les traitements ?

    Je pense que tu es parti sur la bonne voie, sachant que tu pourrais peut être optimiser la partie traitement.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Merci de ta réponse. Quelques précisions:

    Les traitements ont été threadés uniquement pour ne pas bloquer le rafraichissement de l'IHM car de toutes façon, les traitements accèdent à une DLL qui n'est pas thread-safe (i.e. il n'y a jamais deux traitements simultanés).

    Donc je me dis : autant supprimer tous ces threads et ne plus en faire qu'un seul qui s'occupe uniquement du rafraichissement de l'IHM (sans pouvoir déclencher de traitement parallèle). Le problème étant que la VCL n'étant pas thread-safe ça parait bizarre de s'occuper de l'IHM dans un thread, mais pourquoi pas avec un Synchronize. Je ne sais pas si cette façon de faire tiens la route, et j'hésite à partir dans de grosses modifs d'architecture (quoique ce n'est pas si énorme, ça doit être faisable dans une journée).

  4. #4
    DMO
    DMO est déconnecté
    Membre chevronné
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Par défaut
    Bonjour gnogno,

    Je suis du même avis que declencher.

    Citation Envoyé par gnogno
    faire un seul thread qui s'occupe de faire "vivre" l'IHM
    Ne te méprends pas sur le Synchronize, il n'a pour but que de bloquer le thread pour d'attendre que le thread principal vienne executer la méthode. le thread est ensuite débloqué.

    Donc faire un thread qui appelle continuellement synchronize n'a aucun intéret.

    Il faut voir ce dont tu as besoin. Tu peux peut-être te passer de multi-thread si tu ne veux pas de traitements simultanés. Si tu souhaites que l'application soit accessible uniquement pour pouvoir eventuellement cesser le traitement, quelques Application.ProcessMessages bien placés pouront largement faire l'affaire, d'autant que tu n'auras alors pas de problèmes de synchronisation ou d'accès multiples aux memes ressources. Le traitement sera simplement ralenti pour rafraichir l'IHM et traiter d'eventuels messages (comme l'appui sur un bouton STOP par exemple).

    Maintenant, si tu veux vraiment travailler avec l'IHM, faire autre chose pendant que un lourd traitement de fond travaille en arrière-plan, il ne faut pas hésiter à passer en multi-thread, mais selon ta première idée, surtout pas la seconde.

    Citation Envoyé par gnogno
    Cette solution permettrait un codage beaucoup plus simple des traitements
    Enfin, il est vrai qu'une véritable application multi-thread doit être développée avec rigueur car comme tu as vu ca devient vite un casse tête ! J'en ais d'ailleurs encore un peu mal à la tête :p Je crois qu'il est normal que ce ne soit pas facile.

    Mais il faut utiliser sans peur la solution la plus adaptée à ton problème.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 10
    Par défaut
    Merci pour ces explications très claires.

    En fait (en informatique il y a toujours un "en fait" qui met tout par terre ), dans le rafraichissement de l'IHM, il y a aussi la mise à jour d'un VirtualTreeView qui tape aussi dans la DLL (cette fois-ci en réentrant).

    D'autre part, il m'est impossible d'insérer des Application.ProcessMessages dans les traitements effectués dans la DLL car c'est une DLL de calcul écrite en C++.

    Je vais donc garder ce que j'ai fait et demander à faire faire des modifs au niveau de la DLL pour pouvoir gérer les cas d'erreur insolubles du fait de l'architecture multi-thread : par exemple quand on déclenche un traitement qui provoque une erreur et que selon l'erreur il faut re-saisir les paramètres du traitement ou pas, il me faudra un point d'entrée dans la DLL pour vérifier ces paramètres avant de partir dans le thread.

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. Accès à une application ouverte (OLE Automation ?)
    Par PascalB dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/06/2002, 14h39
  3. Réponses: 1
    Dernier message: 13/05/2002, 09h19
  4. [Kylix] Execution d'une application hors de l'edi
    Par Sadam Sivaller dans le forum EDI
    Réponses: 1
    Dernier message: 20/04/2002, 23h22
  5. Réponses: 2
    Dernier message: 15/04/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo