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

C++Builder Discussion :

VCL et Treads [Non suivi]


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut VCL et Treads
    Bonjour,

    je patauge un peu avec les thread.
    voila le contexte :
    j'ai une fonction d'export d'un Tdataset vers Excel. �a fonctionne bien mais �a peut �tre tr�s long puisque �a parcourt l'ensemble du dataset.
    j'aurais donc voulu placer cet export dans un tread � part avec une progressbar eventuellement mais ce n'est pas indispensable
    Cr�er le thread pose pas trop de probl�me, mais cela fige l'application.

    Et ce malgr� l'utilisation de Synchronize.

    y'a-t-il une d�marche particuli�re � suivre? un bon tuto sur les threads?
    J'ai cherch� mais rien de tr�s concluant.

    merci d'avance

  2. #2
    Membre confirm� Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Par d�faut Threads
    Bonjour,
    Tu peux nous poster un peux de code ?
    Focntion thread, l'appel du thread ....

  3. #3
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    vi, c possible

    l'execute du thread :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    _progressbar->ProgressBar->Position = 0;
      Synchronize(ExportTo);
    _progressbar est une form membre du thread instanci�e ds le constructeur de celui-ci.

    la fonction d'export vers Excel :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    TSaveDialog* TSD_SaveExcel = new TSaveDialog(Welcome);
    TSD_SaveExcel->InitialDir = ".\\Exports";
    TSD_SaveExcel->Filter = "Fichiers Excel (*.xls)|*.XLS";
    TSD_SaveExcel->Title = "Exporter vers...";
    ShowMessage("bouh");
    if (TSD_SaveExcel->Execute())
            {
                bool QuitExcelToEnd;
                Variant vFilename, vSaveChanges;
                Variant vMSExcel, vXLWorkbook, vXLWorkbooks, vWorksheet, vRange, vCell, vValue, vColl;
                int NumLine = 1;  // contient le numéro de la ligne où l'on commence à écrire les données sous Excel
                int NumCol = 65;  // "A" code ASCII 65 (réf. à la 1ère colonne sous Excel)
                try
                {
                   vMSExcel = Variant::GetActiveObject("Excel.Application");   // Capture d'une instance existante d'Excel
                }
                // Si Excel n'est pas déjà ouvert, une exception est levée ...
                catch(EOleSysError& e )
                {
                   vMSExcel = Variant::CreateObject("Excel.Application");      // Si Excel n'est pas lancé, on l'exécute
                }
                vMSExcel.OlePropertySet("Visible", true);                   // Si Excel était déjà lancé, on le laisse visible
                QuitExcelToEnd = false;                                     // On ne fermera pas Excel après le traitement.
     
                vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");           // Récupération du pointeur vers la collection des Workbooks
                vXLWorkbook = vXLWorkbooks.OleFunction("Add");                 // Ajout d'un nouveau Workbook à la collection
                vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets","Feuil1");   // On active le sheet par défaut "Feuil1"
     
                _source->First();                  // On se place sur le 1er enregistrement de la requête
                for (int j = 0; j < _source->FieldCount; j++)     // ... et son nb de champs pr libellés colonnes
                {
                  AnsiString Ref = "";                               // contiendra la référence à la cellule Excel, i.e. "A1"
                  Ref.cat_sprintf("%c%d", NumCol+j, NumLine);      // donne "A1" pour 65 et 1
                  vRange = StringToOleStr(Ref);                      // Ref est converti en Range (bien qu'il s'agisse toujours d'un Variant)
                  vCell = vWorksheet.OlePropertyGet("Range", vRange);// récupération du pointeur vers la cellule sélectionnée ("A1")
                  vValue = StringToOleStr(_source->Fields->Fields[j]->DisplayName);
                  vCell.OlePropertySet("Value", vValue);             // affectation de la valeur de la requête à la cellule référencée ("A1")
                }
                NumLine = 2;                    //on se place sur la ligne suivant les libellés...
                for (int t = 0; t < [color=red]_source[/color]->RecordCount; t++)       // nb d'enregistrements de la requête
                {
                   for (int i = 0; i < _source->FieldCount; i++)     // ... et son nb de champs
                   {
                      AnsiString Ref = "";                               // contiendra la référence à la cellule Excel, i.e. "A1"
                      Ref.cat_sprintf("%c%d", NumCol+i, NumLine+t);      // donne "A1" pour 65 et 1
                      vRange = StringToOleStr(Ref);                      // Ref est converti en Range (bien qu'il s'agisse toujours d'un Variant)
                      vCell = vWorksheet.OlePropertyGet("Range", vRange);// récupération du pointeur vers la cellule sélectionnée ("A1")
                      vValue = StringToOleStr(_source->Fields->Fields[i]->AsString);
                      vCell.OlePropertySet("Value", vValue);             // affectation de la valeur de la requête à la cellule référencée ("A1")
                   }
                   _source->Next();             // on passe à l'enregistrement suivant
                   [color=red]_progressbar->ProgressBar->StepBy(count);
                    count = count + 1;[/color]            }
     
                 vFilename = StringToOleStr(TSD_SaveExcel->FileName);   // le nom de fichier de la SaveDialog est converti au format OLE
                vMSExcel.OlePropertySet("DisplayAlerts", false);         // on désactive les DisplayAlerts d'Excel (pour éviter les messages d'overwriting d'Excel)
                vXLWorkbook.OleProcedure("Saveas", vFilename);           // sauvegarde du fichier sous le nom préalablement sélectionné
                vSaveChanges = true;    // true : modif save, false : not save, Unassigned : demande à l'utilisateur
                //vXLWorkbook.OleFunction("Close", vSaveChanges, vFilename);  // fermeture du classeur qui a recueilli les données
                vMSExcel.OlePropertySet("DisplayAlerts", true);          // réactivation des DisplayAlerts
                if (QuitExcelToEnd)                                      // Excel doit-il être fermé ?
                {                                                        // Si oui ...
                   vMSExcel.OleFunction("Quit");                         // on le ferme
                   vMSExcel = Unassigned;                                // ... et le pointeur de son instance est réinitialisé
                }
             }
    delete TSD_SaveExcel;
    Une fonction d'export trouv�e sur Developpez.
    _source est un dataset* membre du thread, initialis� � la construction.

  4. #4
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    Bonjour..
    �a n'inspire personne. je suis surpris que personne n'ait d�j� rencontr� ce probl�me.
    j'ai bien regard� du c�t� du forum delphi mais rien de tr�s concluant.

  5. #5
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    bon, je vais essayer d'en sp�cifier plus...
    en fait quand je mets le code de la fonction ExportTo dans Execute, le thread s'arr�te sur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vMSExcel = Variant::GetActiveObject("Excel.Application");
    getactive est consid�r� comme faisant partie de la VCL?

    franchement, je suis paum�..;

  6. #6
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    62
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 62
    Par d�faut Re: VCL et Treads
    Citation Envoy� par say
    Cr�er le thread pose pas trop de probl�me, mais cela fige l'application.
    Et ce malgr� l'utilisation de Synchronize.
    Ce n'est pas "malgr�" qu'il faut utiliser mais "� cause".
    Si tu avais eu la bonne id�e de consulter l'aide de Synchronize, tu aurais lu ceci :
    Description

    Synchronize causes the call specified by Method to be executed using the main VCL thread, thereby avoiding multi-thread conflicts. If you are unsure whether a method call is thread-safe, call it from within the Synchronize method to ensure that it executes in the main VCL thread.

    Execution of the thread current is suspended while Method executes in the main VCL thread.
    Le thread que tu as cr�� ne sert � rien, puisqu'il attend gentillment que le main thread (le thread d'affichage) r�alise l'exporte.
    Et pendant ce temps, l'IHM est fig�e.

    Pour mettre � jour une progress bar ou tout autre objet VCL, depuis un thread secondaire, il faut utiliser le m�canisme des messages windows (PostMessage).

  7. #7
    say
    say est d�connect�
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    1 176
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 1 176
    Par d�faut
    Citation Envoy� par Troll
    Si tu avais eu la bonne id�e de consulter l'aide de Synchronize, tu aurais lu ceci :
    Tu te doutes bien que c'est ce que j'ai fait, j'ai �galement pr�cis� que j'�tais all� sur le forum Delphi...
    Je comprends bien que le synchronize rend la main au thread vcl.

    [la progressbar c'est pour faire joli, je regarderais du c�t� des messages windows, cependant, si le composant VCL fait parti du thread �a ne pose aucun probl�me,ce qui est mon cas et la progressbar fonctionne aussi bien dans l'ex�cute et qu'au travers du synchronize],

    Cependant, en retirant ces traitements VCL ,le simplement traitement d'export ne fonctionne pas comme je le voudrais. l'id�e, c'est que cela tourne alors qu'on peut continuer � bosser (dans le cas d'export volumineux). Or si je place le traitement dans le synchronize (on se comprend), forc�ment �a fige. Mais si je le place dans l'ex�cute, il ne se passe rien...mais pas le GetActiveObjet....
    je demandais donc si cela faisait partie de la VCL.

  8. #8
    Membre �clair�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    62
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 62
    Par d�faut
    Citation Envoy� par say
    Cependant, en retirant ces traitements VCL ,le simplement traitement d'export ne fonctionne pas comme je le voudrais. l'id�e, c'est que cela tourne alors qu'on peut continuer � bosser (dans le cas d'export volumineux). Or si je place le traitement dans le synchronize (on se comprend), forc�ment �a fige. Mais si je le place dans l'ex�cute, il ne se passe rien...mais pas le GetActiveObjet....
    je demandais donc si cela faisait partie de la VCL.
    OK, je n'avais pas bien compris.
    Effectivement il ya peut-�tre des contraintes avec l'utilisation d'objet com et les thread, mais je ne les connais pas.

Discussions similaires

  1. [VCL] Comment faire une barre d'outils skinable comme FireFox ?
    Par DarkChamallo dans le forum Composants VCL
    R�ponses: 23
    Dernier message: 07/05/2008, 18h03
  2. [VCL][TListView]Montrer une ligne � l'�cran
    Par ptitbob dans le forum Delphi
    R�ponses: 4
    Dernier message: 23/07/2007, 16h35
  3. [VCL]toolbar verticale
    Par mandale dans le forum Composants VCL
    R�ponses: 5
    Dernier message: 01/10/2004, 14h26
  4. [VCL] Scroller un contr�le par code
    Par sbeu dans le forum Composants VCL
    R�ponses: 3
    Dernier message: 31/03/2004, 10h39
  5. VCL de Crystal Report pour utilisation dans C++Builder
    Par dibak dans le forum C++Builder
    R�ponses: 4
    Dernier message: 16/02/2004, 17h04

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