Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c++] problema aggiornamento progress bar

    Giorno a tutti!
    Nuovo giorno, nuovo problema: ho un programma che esege la coppia di una grande mole di dati (circa 700Mb) e per visualizzare il progresso ho inserito un progress bar
    codice:
    HWND ProgBar = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD|WS_VISIBLE, 100,250, 350, 40, hwnd, NULL, hInstance, 0);
    che vado poi ad aggiornare con:
    codice:
    SendMessage(ProgBar, PBM_SETPOS, percent, 0);
    dove percent è un int che effettivamente assume valori da 0 a 100. Il problema è che la copia dei dati occupa una buona percentuale della CPU e ci sono difficoltà di aggiornamento della finestra e della progress bar, in poche parole sembra tutto bloccato.
    Esiste un modo per evitare questo?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    8
    Proprio ieri ho aperto anch'io una discussione sullo stesso identico problema. Il mio programma trasferisce dati via ftp: funziona solo che la finestra è bloccata.

    Se trovi una soluzione fammi sapere perchè non so dove sbattere la testa!!!

  3. #3
    Ricordo che 2-3 anni fa quando usavo Vb6 a scuola c'era l'istruzione "DoEvents" che passava momentaneamente il controllo all'OS in modo da non fa apparire tutto bloccato.

    Ora mi rimane da trovare una cosa simile per il C

    Edit: ecco ho trovato su un forum: qui dicono che non esiste in C una funzione simile a DoEvent e di far compiere il lavoro a 2 thread sepatati... Mmmm qui si va su un capo a me sconosciuto, qualche linkone da darmi e quali API devo studiarmi?

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Io faccio più o meno così:


    codice:
    void  CmyProgressBarDlg :: DoDataExchange(CDataExchange* pDX)
    {
    	DDX_Control(pDX, IDC_PROGRESS1, m_bar);
    }
    
    //.......... 
    
    	m_bar.SetRange( 0, 100 ); //fisso il range da 0 a 100 
    
    	int  indicePosz = 0;
    
    	{							
    		indicePosz = (espressione che mi restituisce la posizione tra 0 e 100)
    
    		m_bar.SetPos( indicePosz );
    	}
    Non ho problemi con grandi quantità di dati, però mi muovo in ambiente MFC.
    P.S. L'operatore di portata l'ho separto con uno spazio a destra e uno a sinistra altrimenti si visualizza una moticones

  5. #5
    Originariamente inviato da API83
    Proprio ieri ho aperto anch'io una discussione sullo stesso identico problema. Il mio programma trasferisce dati via ftp: funziona solo che la finestra è bloccata.

    Se trovi una soluzione fammi sapere perchè non so dove sbattere la testa!!!

    il trasferimento dati lo deve fare un THREAD DIFFERENTE da quello della coda dei messaggi!
    DYNAMIC+ [ E-mail ]

    Secondo me non si può fare!

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    8
    Mi sto documentando sui thread, perchè fino ad ora non mi è servito sapere cosa fossero. Su MSDN ho visto che viene spiegato qualcosa:

    http://msdn.microsoft.com/library/it..._and_win32.asp

    Prova un po a vedere se trovi qualcosa che può aiutarti.
    Purtroppo io uso C e non C++ quindi di più non so dirti.

  7. #7
    Io ho risolto usando:
    codice:
    for (int i = 0; i < source_length; i++)
    {
         HANDLE    hIOMutex= CreateMutex (NULL, FALSE, NULL);
         WaitForSingleObject( hIOMutex, INFINITE );
         //copia dei dati
         ReleaseMutex( hIOMutex);
         percent = (int) (write* 100 / size);
         SendMessage(ProgBar, PBM_SETPOS, percent, 0);
    }
    E pare funzionare, non so perchè dato che non ho letto molto la documentazione ma per ora mi basta, tornerò a sbatterci la testa più avanti

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    8
    Io ho trovato una soluzione diversa dalla tua zero85, e non mi sembra che tu abbia creato un thread ulteriore.
    per prima cosa ho impostato MVC++ (il compilatore) con l'opzione \MT per il multithread. poi ho creato un thread nuovo

    codice:
    void Thread(PVOID pvoid)
    {
    hOpen = InternetOpen("",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    hFtp = InternetConnect(hOpen,cfg.server,INTERNET_DEFAULT_FTP_PORT,cfg.user,cfg.pass,INTERNET_SERVICE_FTP,0,0); 
    hFile = FtpOpenFile(hFtp,"Prova_arch.rar",
                       GENERIC_WRITE,FTP_TRANSFER_TYPE_BINARY,0);
    
    file = CreateFile("Prova_arch.rar",GENERIC_READ,
                       FILE_SHARE_READ,NULL,OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,NULL);			
    
    sum = 0;
    
    do
    {
     ReadFile (file, Buffer, sizeof(Buffer),&dwBytesRead, NULL);	
     InternetWriteFile(hFile,Buffer,dwBytesRead,&dati_scritti);
     SendMessage(hProgressBar,PBM_SETPOS,(WPARAM)(int)sum/2048,0);
     sum +=dati_scritti;
    }
    while(sum < Size);
    
    InternetCloseHandle(hOpen);
    InternetCloseHandle(hFile);
    InternetCloseHandle(hFtp);
    CloseHandle(file);
    
    _endthread();
    }
    tralasciando che io faccio una "copia" in remoto.
    Per avviare l'upload premo un BUTTON che ha ID IDM_AVVIA

    codice:
    case IDM_AVVIA:
        _beginthread(Thread,0,NULL);
        break;
    e uso _beginthread.
    A me funziona benissimo, anche se provo a trasferire 80Mb la progressbar non si ferma mai, neanche se provo a spostare la finestra.

    Spero di essere stato d'aiuto e spero che quello che ho fatto sia esatto.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    La

    _endthread();

    non è necessaria in quanto si trova alla fine del thread e quindi sarebbe automaticamente richiamata.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.