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 :

Thread DownLoad / CheckVersion


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut Thread DownLoad / CheckVersion
    Bonjour,

    J'ouvre ici un nouveau topic concernant ma demande :

    J' ai repris donc la proposotion de AndNotOr.

    Les premiers test sont trés concluant, mais j'ai quelques questions dans le fonctionnement.

    Voilà de quoi on part :

    CheckVersion.Pas

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    unit CheckVersion; // Inventé par AndNotor
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, URLMon, ShellAPI, Forms;
     
    const
      WM_NEWVERSION       = WM_USER;       //Message Nouvelle version disponible
      WM_DOWNLOADCOMPLETE = WM_USER +1;    //Téléchargement terminé (ou erreur)
     
    type
      //Tâche contrôle de version
      TCheckVersionThread = class(TThread)
      private
        Wnd            :hWnd;    //Fenêtre qui reçoit les notifications
        RemoteFile     :string;  //HTTP://... fichier distant contenant le numéro de version
        CurrentVersion :string;  //Version actuellement installée
      protected
        function  CompareVersion(aFileName :TFileName) :boolean;
        procedure Execute; override;
      public
        constructor Create(const aWnd :hWnd; const aRemoteFile, aCurrentVersion :string);
      end;
     
      //Tâche téléchargement
      TDownloadNewVersionThread = class(TThread)
      private
        Wnd        :hWnd;        //Fenêtre qui reçoit les notifications
        RemoteFile :string;      //HTTP://... fichier nouvelle version
      protected
        procedure Execute; override;
      public
        constructor Create(const aWnd :hWnd; const aRemoteFile :string);
      end;
     
    implementation
     
    { TCheckVersionThread }
     
    function TCheckVersionThread.CompareVersion(aFileName: TFileName): boolean;
    begin
      //A toi d'implémenter ton contrôle de version :-)
      //Pour la demo, renvoi toujours vrai !
      Result := TRUE;
    end;
     
    constructor TCheckVersionThread.Create(const aWnd :hWnd; const aRemoteFile, aCurrentVersion: string);
    begin
      inherited Create(FALSE);
     
      Wnd            := aWnd;
      RemoteFile     := aRemoteFile;
      CurrentVersion := aCurrentVersion;
     
      //Libération automatique à la fin du thread
      FreeOnTerminate := TRUE;
    end;
     
    procedure TCheckVersionThread.Execute;
    var
      TempFileName :array[0..MAX_PATH] of Char;
     
    begin
      //Télécharge dans le cache internet.
      //On aurait aussi pu récupérer directement une chaîne
      //avec un idHttp sans passer par un fichier
      if URLDownloadToCacheFile(nil, PChar(RemoteFile), TempFileName, MAX_PATH, 0, nil) = S_OK then
     
        //Comparaison...
        if CompareVersion(TempFileName) then
     
          //...et le cas échéant, notifie la fiche principale
          PostMessage(Wnd, WM_NEWVERSION, 0, 0);
    end;
     
    { TDownloadNewVersionThread }
     
    constructor TDownloadNewVersionThread.Create(const aWnd: hWnd; const aRemoteFile: string);
    begin
      inherited Create(FALSE);
     
      Wnd        := aWnd;
      RemoteFile := aRemoteFile;
     
      //Libération automatique à la fin du thread
      FreeOnTerminate := TRUE;
    end;
     
    procedure TDownloadNewVersionThread.Execute;
    var
      TempFileName :array[0..MAX_PATH] of Char;
      Result       :integer;
     
    begin
      //Télécharge dans le cache internet...
      Result := URLDownloadToCacheFile(nil, PChar(RemoteFile), TempFileName, MAX_PATH, 0, nil);
     
      //...et notifie la fiche principale, même en cas d'erreur !
      //Attend la décision de la tâche principale (installation (ID_YES) ou non)
      if SendMessage(Wnd, WM_DOWNLOADCOMPLETE, Result, integer(@TempFileName)) = ID_YES then
      begin
        ShellExecute(0, 'open', TempFileName, nil, nil, SW_SHOWNORMAL);
        PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0);
      end;
    end;
     
    end.
    Ma form principal :

    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
    procedure TFPrincipal.FormCreate(Sender: TObject);
    begin
    //Lance la tâche de contrôle
      TCheckVersionThread.Create(Handle, 'http://xxxxx.com/version.txt', Logiciel.Version);
    // ...
     
    end;
     
     
    procedure TFPrincipal.WMDownloadComplete(var Message: TMessage);
    begin
      //Ne fait rien par défaut
      Message.Result := mrAbort;
      case Message.WParam of
        S_OK          : //Téléchargement terminé
                        Message.Result := MessageDlg('Téléchargement terminé !'#13
                                                    +'Installer maintenant ?',
                                                    mtConfirmation, [mbYes, mbNo], 0);
        E_FAIL        : //Erreur
                        MessageDlg('Erreur de téléchargement !', mtError, [mbOk], 0);
     
        E_OUTOFMEMORY : //Erreur
                        MessageDlg('Mémoire insuffisante !', mtError, [mbOk], 0);
      end;
    end;
     
     
    procedure TFPrincipal.WMNewVersion(var Message: TMessage);
    begin
    //Nouvelle version disponible
      if MessageDlg('Une nouvelle version est disponible.'#13
                   +'Voulez-vous la télécharger et l''installer maintenant ?',
                   mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        TDownloadNewVersionThread.Create(Handle, 'http://monsite.com/xxxxxxx.exe');
    end;
    C'est dans la comparaison de version que cela me pose problème.

    En fait pour simplifier le contrôle, je nomme sur mon site le nom du fichier avec le nom de la version disponible. Genre
    1-6-0-30.txt

    Je récupère ce nom et je le transforme en 1.6.0.30, puis je le compare avec la currentVersion.

    Mais je ne comprends pas ce que fait cette procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCheckVersionThread.Create(Handle, 'http://xxxxx.com/1-6-0-30.txt', Logiciel.Version);
    Est-ce qu'elle télécharge le fichier ? sinon est-ce que je récupère aRemoteFile dans ma procédure de vérification ?

    Et surtout, si je réponds 2 fois oui pour le téléchargement (parceque la première fois je n'ai pas dis oui pour l'installation), le fichier sera complété d'un [1] soit 1-6-0-30[1].txt, peut-on remedier à cela ?

    De plus, est-il envisageable de voir un progressbar dans la form principal qui permet de voir le téléchargement en cours ? ou c'est trop complexe à faire et je balance juste dans le statutbar (Téléchargement en cours...)

    Merci beaucoup, et à bientôt

  2. #2
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    pourquoi tu crée pas un fichier avec un nom fixe et tu met le numéro de version dedans?

    sinon pour télécharger un fichier sans fichier temp ni idhttp j'utilise sa:
    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
     
    //pour télécharger un fichier sur Internet et le retourner sous forme de string
    Function DownAndReturnThis(URL: String): String;
    Const
      Agent = 'Check for update';
    Var
      hFile, HInet: HINTERNET;
      Buffer:       Array[0..32767] Of Char;
      BufRead:      Cardinal;
      BufSize:      Cardinal;
    Begin
      // on met le résultat vide si il y a une erreur
      Result := '';
      HInet  := InternetOpen(PChar(Agent), INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0);
      If Assigned(HInet) Then
        Try
          //on essaye d'ouvrir l'adresse du fichier
          hFile := InternetOpenUrl(HInet, PChar(URL), NIL, 0, INTERNET_FLAG_RELOAD +
            INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_EXISTING_CONNECT +
            INTERNET_FLAG_NO_COOKIES, 0);
          //si on a réussi à l'ouvrir
          If Assigned(hFile) Then
            Try
              //on essaie de récupérer les données du fichier
              BufSize := SizeOf(Buffer);
              With TStringStream.Create('') Do
                Try
                  While InternetReadFile(hFile, @Buffer, BufSize, BufRead) And (BufRead > 0) Do
                    Write(Buffer, BufRead);
                  //le résultat est le fichier téléchargé
                  Result := DataString;
                Finally
                  Free; //on libère l'élément qui a permet de stocker le téléchargement de fichiers
                End;
            Finally
              InternetCloseHandle(hFile);
            End;
        Finally
          InternetCloseHandle(hinet);
        End;
    End;

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Citation Envoyé par ouiouioui Voir le message
    pourquoi tu crée pas un fichier avec un nom fixe et tu met le numéro de version dedans?
    Salut,

    Cela evite tout simplement de le télécharger, il y a juste à lire le nom, du moins en ftp. et l'extension txt (ou autre) sera réserve pour cela.

    D'ailleur, je fais la même chose pour la date de validité du produit, par exemple tu autorise l'ouverture du soft jusqu'au 31/01/2009, mois je créé un fichier 31-01-2009.date, ensuite je sais pertinament que .date me donne la date de validité du soft etc...
    La lecture seul du fichier suffit pas besoin de télécharger par besoin de lire son contenu

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Dans CompareVersion, tu as le nom du fichier temporaire. Bien sûr si le nom est susceptible de changer ...

    Le plus simple serait tout de même d'avoir un nom unique, style appname.ver et d'uniquement charger son contenu. Comme le propose Ouiouioui ou avec idHttp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
     idHttp :TIdHttp;
     s :string;
    begin
      with TIdHTTP.Create(nil) do
      try
        s := Get(aRemoteFile);
        ...
      finally
        Free;
      end;
    end;
    Et avec un format ini (ou XML), tu pourrais même y inclure et traiter plus d'information (version, date, commentaire sur la compatibilité, etc.).
    De plus là, tu te limites à une application par répertoire. Imagine qu'elle fasse des petits .

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Re,

    Effectivement, pour simplifier dans la cas précis de versionning, j'ai donc mis cela comme procédure de test de version :

    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
    function TCheckVersionThread.CompareVersion(aFileName: TFileName): boolean;
    Var
        F: TextFile;
        Version:String;
    Begin
      result := false;
     
      AssignFile(F,aFileName);
      Try
        Reset(F); 
        Readln(F,Version);
        CloseFile(F); 
      Except
        Result := False;
      End;
      if Version <> CurrentVersion then result := true;
    end;
    Pour l'histoire de mon .date par contre je reste ainsi c'est plus simple.

    Donc reste à savoir si dans ce thread on peut alimenter un progressbar de la form principal ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    On peut tout faire .

    CheckVersion.pas
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    unit CheckVersion;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, URLMon, ShellAPI, ActiveX, Forms;
     
    const
      WM_NEWVERSION       = WM_USER;       //Message Nouvelle version disponible
      WM_DOWNLOADCOMPLETE = WM_USER +1;    //Téléchargement terminé (ou erreur)
      WM_DOWNLOADPROGRESS = WM_USER +2;    //Progression
     
    type
      //Tâche contrôle de version
      TCheckVersionThread = class(TThread)
      private
        Wnd            :hWnd;    //Fenêtre qui reçoit les notifications
        RemoteFile     :string;  //HTTP://... fichier distant contenant le numéro de version
        CurrentVersion :string;  //Version actuellement installée
      protected
        function  CompareVersion(aFileName :TFileName) :boolean;
        procedure Execute; override;
      public
        constructor Create(const aWnd :hWnd; const aRemoteFile, aCurrentVersion :string);
      end;
     
      //Notifications
      TDownloadStatus = class(TInterfacedObject, IBindStatusCallback)
      private
        Wnd :hWnd;
      public
        function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall; 
        function GetPriority(out nPriority): HResult; stdcall;
        function OnLowResource(reserved: DWORD): HResult; stdcall;
        function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
        function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
        function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
        function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
        function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
      public
        Constructor Create(const aWnd :hWnd);
      end;
     
      //Tâche téléchargement
      TDownloadNewVersionThread = class(TThread)
      private
        Wnd        :hWnd;        //Fenêtre qui reçoit les notifications
        RemoteFile :string;      //HTTP://... fichier nouvelle version
        Status     :TDownloadStatus;
      protected
        procedure Execute; override;
      public
        constructor Create(const aWnd :hWnd; const aRemoteFile :string);
      end;
     
    implementation
     
    { TCheckVersionThread }
     
    function TCheckVersionThread.CompareVersion(aFileName: TFileName): boolean;
    begin
      //A toi d'implémenter ton contrôle de version :-)
      //Pour la demo, renvoi toujours vrai !
      Result := TRUE;
    end;
     
    constructor TCheckVersionThread.Create(const aWnd :hWnd; const aRemoteFile, aCurrentVersion: string);
    begin
      inherited Create(FALSE);
     
      Wnd            := aWnd;
      RemoteFile     := aRemoteFile;
      CurrentVersion := aCurrentVersion;
     
      //Libération automatique à la fin du thread
      FreeOnTerminate := TRUE;
    end;
     
    procedure TCheckVersionThread.Execute;
    var
      TempFileName :array[0..MAX_PATH] of Char;
     
    begin
      //Télécharge dans le cache internet.
      //On aurait aussi pu récupérer directement une chaîne
      //avec un idHttp sans passer par un fichier
      if URLDownloadToCacheFile(nil, PChar(RemoteFile), TempFileName, MAX_PATH, 0, nil) = S_OK then
     
        //Comparaison...
        if CompareVersion(TempFileName) then
     
          //...et le cas échéant, notifie la fiche principale
          PostMessage(Wnd, WM_NEWVERSION, 0, 0);
    end;
     
    { TDownloadNewVersionThread }
     
    constructor TDownloadNewVersionThread.Create(const aWnd: hWnd; const aRemoteFile: string);
    begin
      inherited Create(FALSE);          
     
      Wnd        := aWnd;
      RemoteFile := aRemoteFile;
      Status     := TDownloadStatus.Create(Wnd);
     
      //Libération automatique à la fin du thread
      FreeOnTerminate := TRUE;
    end;
     
    procedure TDownloadNewVersionThread.Execute;
    var
      TempFileName :array[0..MAX_PATH] of Char;
      Result       :integer;
     
    begin
      //Télécharge dans le cache internet...
      Result := URLDownloadToCacheFile(nil, PChar(RemoteFile), TempFileName, MAX_PATH, 0, Status);
     
      //...et notifie la fiche principale, même en cas d'erreur !
      //Attend la décision de la tâche principale (installation (ID_YES) ou non)
      if SendMessage(Wnd, WM_DOWNLOADCOMPLETE, Result, integer(@TempFileName)) = ID_YES then
      begin
        ShellExecute(0, 'open', TempFileName, nil, nil, SW_SHOWNORMAL);
        PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0);
      end;
    end;
     
    { TDownloadStatus }
     
    constructor TDownloadStatus.Create(const aWnd: hWnd);
    begin
      Wnd := aWnd;
    end;
     
    function TDownloadStatus.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
    begin
      PostMessage(Wnd, WM_DOWNLOADPROGRESS, ulProgress, ulProgressMax);
    end;
     
    function TDownloadStatus.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult;
    begin
    end;
     
    function TDownloadStatus.GetPriority(out nPriority): HResult;
    begin
    end;
     
    function TDownloadStatus.OnDataAvailable(grfBSCF, dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
    begin
    end;
     
    function TDownloadStatus.OnLowResource(reserved: DWORD): HResult;
    begin
    end;
     
    function TDownloadStatus.OnObjectAvailable(const iid: TGUID; punk: IInterface): HResult;
    begin
    end;
     
    function TDownloadStatus.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult;
    begin
    end;
     
    function TDownloadStatus.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult;
    begin
    end;
     
    end.
    Et le message WM_DOWNLOADPROGRESS à gérer:
    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
    type
      TForm1 = class(TForm)
        ...
      private
        ...
        procedure WMDownloadProgress(var Message :TMessage); message WM_DOWNLOADPROGRESS;
      end;
     
    implementation
     
    procedure TForm1.WMDownloadProgress(var Message: TMessage);
    begin
      ProgressBar1.Max      := Message.LParam;
      ProgressBar1.Position := Message.WParam;
    end;

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    On peut tout faire .
    ...
    Avec toi, j'en doute pas... Déjà là je suis top largé ... PTR

    Apres je te pris de croire que je vais demandé des exclaircissements.

    Bon j'ai mis en place ta new propal. Mais jamais il passe dans la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TFPrincipal.WMDownloadProgress(var Message: TMessage);
    Il y a-t-il une raison ? j'ai vérifier plusieur fois, a priori j'ai bien ajouter toutes les nouvelles procédure etc...

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Bon,

    J'essai de comprendre.

    Je pense qu'il manque quelquechose dans la procédure Execute de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TDownloadNewVersionThread.Execute;
    Où Alors , parcequ'il n'y a pas d'execute pour A voir

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Et ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := URLDownloadToCacheFile(nil, PChar(RemoteFile), TempFileName, MAX_PATH, 0, Status);

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Pffff

    Même pas capabe de faire un copier coller.... Ce buzz...

    Effectivement c'est tout simplement

    MAGNIFIQUE



    Purée mais où tu va chercher tout ça...

    ps : je reviens avec mes questions....

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    @AndNotOr

    Donc la moindre des choses pour un tel travail, c'est de s'interressé au code et apprendre au max.

    Donc voilà mes petites question...

    - Que ce passe-t-il lors d'un prochain téléchargement ? Car a priori il ne retélécharge pas il part du cachefile !
    - Est-il utile de gérer les autre functions function GetBindInfo,GetPriority,OnDataAvailable,OnLowResource,OnObjectAvailable, OnStartBinding
    Je leur est tous placé un Result := E_NOTIMPL;
    - Peut-on avoir moyen de relance le Thread ? (comme ci on avait besoin de forcer la vérification de newversion par le biais d'un menu ?
    - Lorsque je ferme la Mainform, il coupe la connexion (forcément) et j'ai 3 fuites mémoire
    21 - 28 bytes : TDownloadStatus x1
    77 - 84 bytes : TDowloadNewVersion x1
    85 - 92 bytes : UnicodeString x1

    - Cela signifie quoi le paramètre False de inherited Create(FALSE);
    - pourquoi n 'y a-t-il pas de FreeOnTerminate := TRUE; dans la constructor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TDownloadStatus.Create(const aWnd: hWnd);
    MErci pour tes réponses

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Bon tu as aussi plein d'infos dans l'aide .
    Citation Envoyé par BuzzLeclaire Voir le message
    - Que ce passe-t-il lors d'un prochain téléchargement ? Car a priori il ne retélécharge pas il part du cachefile !
    Espérons que les routines internet soient assez intelligentes pour voir que la date à changée. L'essai serait assez vite fait.

    Citation Envoyé par BuzzLeclaire Voir le message
    - Est-il utile de gérer les autre functions function GetBindInfo,GetPriority,OnDataAvailable,OnLowResource,OnObjectAvailable, OnStartBinding
    Je leur est tous placé un Result := E_NOTIMPL;
    Pas utile à première vue.

    Citation Envoyé par BuzzLeclaire Voir le message
    - Peut-on avoir moyen de relance le Thread ? (comme ci on avait besoin de forcer la vérification de newversion par le biais d'un menu ?
    Encapsule TCheckVersionThread.Create() dans une procédure et appelle-la depuis où tu veux.

    Citation Envoyé par BuzzLeclaire Voir le message
    - Lorsque je ferme la Mainform, il coupe la connexion (forcément) et j'ai 3 fuites mémoire
    Je m'étais déjà posé la question ! Mais logiquement, c'est une tâche indépendante qui se termine d'elle-même. La tâche principale se termine avant (d'où le message), mais à mon avis peu importe. Enfin peu être que je me trompe et que quelqu'un d'autre aura une explication plus pertinente !

    Citation Envoyé par BuzzLeclaire Voir le message
    - Cela signifie quoi le paramètre False de inherited Create(FALSE);
    Typiquement F1 ! Le thread peut être créé dans un état suspendu (pause).

    Citation Envoyé par BuzzLeclaire Voir le message
    - pourquoi n 'y a-t-il pas de FreeOnTerminate := TRUE; dans la constructor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TDownloadStatus.Create(const aWnd: hWnd);
    Ce n'est pas un thread, mais une interface !

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Merci AndNotOr,

    Pour la fuite mémoire elle arrivera que trés rarement de tout façon, j'essai juste de savoir si dans un evenement spécifique du Dowload on pouvais libéré quelquechose avant la fermeture.

    Je te remercie pour ton aide.

    Et encore Chapeau...

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 130
    Par défaut Une question bête pour commencer l'année
    Bonjour et bonne année 2012 à tous


    J'ai repris la façon de faire que vous que avez décrite, mais je me heurte à une erreur que je ne comprend pas. F1, ne m'as pas aidé non plus et mes recherches avec notre ami google pas mieux.

    Donc, dans procedure suivante :

    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
     
    procedure TForm1.WMDownloadComplete(var Message: TMessage);
    begin
      //Ne fait rien par défaut
      Message.Result := mrAbort;
     
      case Message.WParam of
        S_OK          : //Téléchargement terminé
                        Message.Result := MessageDlg('Téléchargement terminé !'#13
                                                    +'Installer maintenant ?',
                                                    mtConfirmation, [mbYes, mbNo], 0);
     
        E_FAIL        : //Erreur
                        MessageDlg('Erreur de téléchargement !', mtError, [mbOk], 0);
     
        E_OUTOFMEMORY : //Erreur
                        MessageDlg('Mémoire insuffisante !', mtError, [mbOk], 0);
      end;
    end;
    j'ai une ereur à la compilation :
    [DCC Erreur] UMain.pas(60): E1012 L'expression constante dépasse les limites de sous-étendue

    ici c'est la ligne 13 (E_FAIL) et ligne 16 (E_OUTOFMEMORY) qui pose problème.

    Qu'est ce que cela veut dire ???

    Merci

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

Discussions similaires

  1. Download et thread, ne fais pas bon ménage.
    Par Twubi dans le forum Web & réseau
    Réponses: 2
    Dernier message: 06/07/2009, 09h42
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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