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 :

suspendre thread vcl à partir d'un thread secondaire


Sujet :

Langage Delphi

  1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 297
    Points : 3 551
    Points
    3 551
    Par défaut suspendre thread vcl à partir d'un thread secondaire
    bonjour,

    mon application vcl crée des threads à partir de TThread pour gérer différents traitements
    je voudrais que certains d'entre eux puissent suspendre le thread principal vcl à partir du thread secondaire
    comme la méthode Suspend ne s'applique qu'à l'objet créé, j'avais pensé utiliser l'api pour y parvenir dans ce style:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SuspendThread(OpenThread(THREAD_SUSPEND_RESUME,False,GetWindowThreadProcessID(fmPrefs.Handle,nil)));
    malheureusement, ça marche tellement bien que si le thread principal est bien suspendu,
    le thread appelant l'est également (le code suivant cette ligne ne s'exécute pas)

    est-ce un problème lié à delphi ou existe-il un autre moyen ?

    merci par avance pour toutes vos suggestions
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par omen999 Voir le message
    bonjour,

    mon application vcl crée des threads à partir de TThread pour gérer différents traitements
    je voudrais que certains d'entre eux puissent suspendre le thread principal vcl à partir du thread secondaire
    comme la méthode Suspend ne s'applique qu'à l'objet créé, j'avais pensé utiliser l'api pour y parvenir dans ce style:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SuspendThread(OpenThread(THREAD_SUSPEND_RESUME,False,GetWindowThreadProcessID(fmPrefs.Handle,nil)));
    malheureusement, ça marche tellement bien que si le thread principal est bien suspendu,
    le thread appelant l'est également (le code suivant cette ligne ne s'exécute pas)

    est-ce un problème lié à delphi ou existe-il un autre moyen ?

    merci par avance pour toutes vos suggestions
    Si tu fais bien cet appel dans le 'Execute' de ton second thread alors je ne vois pas pourquoi cela interromperait également son exécution. Pour info tu as la variable 'MainThreadID' qui contient en permanence l'id de la thread VCL, tu n'es pas obligé de faire ton appel à 'GetWindowThreadProcessID(***)' et ça évitera une erreur éventuelle à ce niveau.

    Autre chose, chez moi (pourtant Delphi7, qui supporte en théorie Win2000) je n'ai pas cette fonction "OpenHandle" ? et même dans l'aide SDK intégrée il est spécifié "The Win32 API does not provide a way to get the thread handle from the thread identifier"...
    C'est étonnant alors qu'à priori cette API existe depuis Windows 2000
    (http://msdn.microsoft.com/en-us/libr...35(VS.85).aspx)

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 297
    Points : 3 551
    Points
    3 551
    Par défaut
    je ne vois pas pourquoi cela interromperait également son exécution.
    exact car je viens de me rendre compte que les traitements postérieurs utilisent des ressources vcl qui sont évidemment indisponibles puisque j'ai suspendu le mainthread
    donc c'est résolu ou plutôt à délester
    en delphi 4 (j'avais oublié de préciser), la propriété MainThreadID n'existe pas
    Autre chose, chez moi (pourtant Delphi7, qui supporte en théorie Win2000) je n'ai pas cette fonction "OpenThread" ?
    ça c'est normal, cette déclaration n'a pas été maj dans windows.pas
    je l'avais ajoutée dans mon unité declarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function OpenThread(dwDesiredAccess:DWORD;bInheritHandle:BOOL;dwThreadId:DWORD):THandle;stdcall;external 'kernel32.dll';
    merci de ta réponse
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par omen999 Voir le message
    exact car je viens de me rendre compte que les traitements postérieurs utilisent des ressources vcl qui sont évidemment indisponibles puisque j'ai suspendu le mainthread
    donc c'est résolu ou plutôt à délester
    en delphi 4 (j'avais oublié de préciser), la propriété MainThreadID n'existe pas

    ça c'est normal, cette déclaration n'a pas été maj dans windows.pas
    je l'avais ajoutée dans mon unité declarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function OpenThread(dwDesiredAccess:DWORD;bInheritHandle:BOOL;dwThreadId:DWORD):THandle;stdcall;external 'kernel32.dll';
    merci de ta réponse
    Ok pour OpenThread et content que ton problème soit résolu même si j'y suis pour rien ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/12/2013, 11h54
  2. Modifier un form à partir d'un thread secondaire (MethodInvoker)
    Par Denethor9 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/04/2011, 10h17
  3. creer un thread a partir d'un thread
    Par tims12 dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 23/12/2009, 12h56
  4. Réponses: 7
    Dernier message: 10/04/2008, 13h59
  5. Synchronisation VCL à partir de Thread
    Par dlecomte dans le forum Langage
    Réponses: 3
    Dernier message: 28/04/2006, 11h03

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