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

MFC Discussion :

problème de Threads avec Excel


Sujet :

MFC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut problème de Threads avec Excel
    Bonjour à tous,

    J'ai un petit problème avec le pilotage d'Excel via un thread.
    J'utilise en effet un thread que j'appelle pour lancer une feuille excel et récuperer des données en temps réel.
    Le thread est donc sans arret en train de recuperer de la feuille!

    Le problème intervient lorsque j'accede à la feuille et que je modifie la valeur d'une cellule. Le thread me renvoie une Ole Exception RPC_E_CALL_REJECTED.

    Après m'être renseigné, j'ai essayé de changer l'initialisation du thread en le déclarant multi thread apartment grâce à la ligne:
    ::CoInitializeEx(NULL, COINIT_MULTITHREADED );

    Alors qu'auparavant, j'utilisais ::CoInitialize(NULL). Ca me lève toujours une exception mais cette fois ci le message est RPC_E_SERVERCALL_RETRYLATER.

    Donc apparemment le thread aime pas du tout que l'utilisateur touche à son instance d'excel en même temps que lui.

    Le problème que lorsque j'utilisais exactement le meme programme dans le main thread, et cela marchait sans aucun soucis.
    C'est ce qui me fait croire qu'il existe un moyen d'éviter la levée d'exception, mais n'étant pas un spécialiste de MFC et COM, j'avoue je ne sais pas trop comment faire.

    merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Utilises Excel en "local server" ou en "in-process server" ?
    Dans le premier cas, le type d'apartment du thread utilisé ne devrait pas changer grand-chose...

    Par contre, il ne faut aucun échange de pointeur d'interface "brut" entre tes threads s'ils ne sont pas dans le même apartment.


    PS: Apparemment, tu devrais pouvoir catcher l'exception RPC_E_SERVERCALL_RETRYLATER et simplement, comme son nom l'indique, sauter cette itération de récupération (pour "réessayer plus tard" à la suivante). Je ne pense pas qu'on puisse vraiment éviter qu'elle soit lancée lors d'une modification concurrente d'excel...

    Mais peut-être peux-tu, au lieu de récupérer les données en permanence, attendre des événements COM en provenance d'Excel?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Je ne sais pas trop ce que cache les notions de local server ou in process serveur mais je dirais in-process server vu qu'excel est lancé directement dans le thread.

    Je ne passe aucun paramètre à mon thread, j'appelle mon thread avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       HWND hWnd = GetSafeHwnd();
       CWinThread *threadcalc = AfxBeginThread( mcProc, hWnd, THREAD_PRIORITY_NORMAL );
    Puis je lance Excel dans le thread de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CApplication app;
    if(!app.CreateDispatch((LPCTSTR)L"Excel.Application.12",pe))
    ...

    En ce qui concerne l'exception,c'est surtout que je ne comprends pas pourquoi elle est levée dans mon thread fils, mais qu'elle n'est pas levée dans mon main thread.

    En effet au début je voulais capturer un évènement Sheet_Calculate(), comme il est possible de le faire avec en VBA avec la sub Worksheet_Calculate(). Cela aurait été beaucoup plus pratique et élégant.
    Mais je ne sais pas comment faire pour gérer les evenements Excel sous MFC.. et je n'ai rien trouvé la dessus.
    Si tu as des infos la dessus je suis preneur

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Apparemment, Excel ne peut pas du tout être utilisé en in-process, sont tu dois être en serveur local (Le CreateDispatch() lance un nouveau processus Excel.exe que tu dois pouvoir voir dans le gestionnaire de tâches).

    Malheureusement, je ne sais pas non plus comment utiliser les événements COM avec Office, ni depuis MFC...

Discussions similaires

  1. Petit problème de VB6 avec excel
    Par petit rabot dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 20/11/2010, 11h04
  2. Problème de threads avec RCP (SWT inside)
    Par slashmax dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 11/07/2008, 15h00
  3. Problème SWT & thread avec readLine()
    Par TheFuzion dans le forum Général Java
    Réponses: 1
    Dernier message: 06/05/2007, 18h42
  4. Problème de déploiment avec Excel et Delphi
    Par wbagg2 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 18/01/2006, 22h59

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