Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [delphi 2006] refresh

    Sto facendo un'applicazione che si collega a un server via ftp....dal quale vengono scaricati dei file.
    Ho un problem di refresh della form, ovvero se lascio l'applicazione sul desktop fare il suo lavoro, quindi il download dei files e nel frattempo apro un'altra applicazione, ritornando sulla precedente videata, diventa tutto bianco....come se non venisse ridisegnata la form....
    Per evitare ciò... ho inserito nel clic del bottone (nel quale viene effettuato il download dei files)il seguente codice "Application.ProcessMessages"; ma non è cambiato molto, forse l'ho usato impropriamente?


    grazie
    Nique

  2. #2
    se non hai esigenze particolari a mio avviso ti conviene aprire un thread che si occupa dello scarico dei file mentre la applicazione prosegue il suo corso normalmente.
    ciao
    sergio

  3. #3
    Probabilmente stai usando delle chiamate bloccanti, una possibile soluzione è rappresentata dall'utilizzo di uno o più TThread.

  4. #4

    [delphi 2006] refresh

    Cosa intendi per chiamate bloccanti?
    Puoi farmi un esempio?


    grazie
    Nique

  5. #5
    il trasferimento via ftp potrebbe richiedere del tempo e questo ti blocca l'applicazione, per questo il consiglio di usare un thread.
    ciao
    sergio

  6. #6

    Programmazione > [delphi 2006] refresh

    OK userò un thread..

    grazie a tutti

    ciao
    Nique

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da niquesca
    Cosa intendi per chiamate bloccanti?
    Quando effettui la richiesta al server per il download dei file, il metodo che invochi non ritorna prima di aver ultimato il suo compito.

    Supponendo che questo metodo venga invocato in seguito al clic su un pulsante, il thread primario dell'applicazione, quello che riceve e gestisce i messaggi in coda, non proseguirà fino a quando l'evento scatenato alla ricezione del messaggio di clic non avrà terminato il proprio compito, bloccando così la coda e impedendo ai messaggi presenti di venire processati, inclusi i messaggi che fanno un refresh dell'interfaccia grafica.

    L'uso della Application.ProcessMessages intima l'elaborazione dei messaggi in coda prima di proseguire l'esecuzione nel punto in cui viene richiamata, ma non è consigliabile a causa di possibili effetti collaterali; ad esempio, se qualcuno chiude l'applicazione mentre stai compiendo un'elaborazione lunga, si possono verificare risultati imprevisti.

    Meglio seguire il suggerimento che ti è stato dato a proposito dei thread: crei un thread secondario da creare ed eseguire quando è necessario scaricare il file; la logica "bloccante" dei componenti che utilizzi ti consente di scrivere il codice in modo sequenziale, senza preoccuparti di aggiungere il controllo della ricezione dei pacchetti, della conclusione delle operazioni e così via, ma la delega al thread esterno lascia al thread primario la possibilità di continuare a gestire i messaggi in coda, quindi i refresh, i clic e così via.

    Ovviamente, dovrai poi documentarti sui meccanismi di rientro, cioè sui modi con cui puoi verificare lo stato del thread esterno e sincronizzarti con esso.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8

    DELPHI] Refresh bloccato dell'interfaccia durante il download di un file

    Grazie alka...

    Ho fatto una prova, ho inserito una parte del codice in un nuovo thread.....in effetti ora quando apro una seconda schermata del pc, l'applicazione in questione non è più bianca però tutti i controlli non vengono disegnati....per disegnare anche loro forse devo mettere in un altro thread tutti i controlli della form? e eseguire un refresh? oppure una sincronizzazione? la seconda vero?

    grazie nique

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Se i controlli non vengono disegnati, probabilmente tra i due thread c'è un legame tale per cui uno attende l'altro durante le operazioni e viceversa, ricadendo nel problema originale.

    Bisognerebbe vedere un po' di codice o capire cosa fa materialmente il thread secondario per saperne di più.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    una versione per kylix e fp che fa quello che chiedi e utilizza la potente libreria libc

    Codice PHP:
    procedure TTBase.TrasferisciPagina ;
    const
      
    LF = ^J;
      
    READ_IOMode 'r';
    var

      
    nome_file string;
      
    locale_adrremote_adr string;
      
    transf_dati string;
      
    strhostuserpsw string;

      
    CmdArr : array[0..512of char;
      
    StrArr : array[0..512of char;
      
    PIOFILE;
      
    pPipeStr Pointer;
      
    string;
      
    pidpid_child integer;
      
    dir_base string;

    begin


       
    // lo preleva dalle impostazioni
       
    locale_adr      := SetLocaleAdrMacro(IniFile.ReadString('Indirizzi Fisici''Root''/var/www/html'));

       
    with DominiTbl do
       
    begin

            remote_adr    
    := FieldByName('adr_root');
            
    remote_adr    := SetRemoteAdrMacro(fDominioremote_adr);

            
    transf_dati  := FieldByName('transf_dati');

            
    host  := FieldByName('ftp_host');
            
    user  := FieldByName('ftp_user');
            
    psw   := FieldByName('ftp_password');

       
    end;

       
    nome_file := GetFileName;

         
    // crea uno script per il trasferimento dei dati
       
    dir_base := ExtractFileDir(Application.ExeName);
           
    // crea la directory bin se non esiste
       
    CreateDir(dir_base '/bin');

    //   if not FileExists(dir_base + '/bin/trasf_pagina') then
       
    begin
         with TStringList
    .Create do
         
    begin

           Add
    ('#!/bin/bash');
           
    Add('#creato da ' automaticamente' + ' il ' + DateToStr(Now));

    // trasferisce via ssh o via rtp
           if transf_dati = '
    ssh' then
           begin
             Add('
    scp $1/$' + user + '@' +host + ':$2');
           end
           else
           begin
             Add('
    ftp ' + host + ' << EOF');
             Add('  
    lcd $1');
             Add('  
    cd $2');
             Add('  
    put $3');
             Add('
    EOF');
           end;

           SaveToFile(dir_base + '
    /bin/trasf_pagina');

           Free;

         end;

         // dài permessi di esecuzione al nuovo file
         str := dir_base + '
    /bin/trasf_pagina' + #0;
         chmod(@str[1], S_IRUSR Or S_IWUSR Or S_IXUSR);

       end;

       str := dir_base + '
    /bin/trasf_pagina ' + locale_adr + ' ' + remote_adr + ' ' + nome_file + #0;

       pid := fork;
       case pid of

           0 :  begin

                     pid_child := GetPid;
                     StrCopy(cmdArr, @str[1]);

                     F := popen(CmdArr, READ_IOMode);
                     if assigned(F) then
                     begin
                          repeat
                            pPipeStr := fgets(StrArr, 1024, F);
                            if Assigned(pPipeStr) then
                            begin
                              LogFile.Write(StrPas(pPipeStr));
                            end;
                          until not Assigned(pPipeStr);
                          pClose(F);
                     end;

                     kill(pid_child, SIGTERM);

                end;

       end;

    end; 
    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.