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

    [VB6] Programma in pausa

    Ciao a tutti,
    ho problemi di performance quando attendo che si verifichi un certo evento.
    Un esempio semplice puo' essere questo: lancio un batch e attendo la creazione di un file.

    Inizialmente facevo così:
    codice:
     Shell FileBat
     do
        DoEvents
     Loop While Dir(FileDaCercare)=""
     ContinuoColCodice
    funziona, ma la DIR fatta in modo ripetitivo manda la cpu al 100%.

    Allora sono passato a:
    codice:
     Shell FileBat
     do
        Sleep 1000: DoEvents
     Loop While Dir(FileDaCercare)=""
     ContinuoColCodice
    va meglio, non ho più problemi di cpu, ma non riesco a visualizzare eventuali form del programma, come se il programma fosse bloccato (e di fatto lo è perchè tramite Sleep lo metto in pausa).
    A parte l'oggetto Timer che non fa al caso mio (perchè devo continuare col codice subito dopo il ciclo), esistono metodi migliori?

    Grazie!!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Ahimè, il metodo migliore sarebbe un thread, che sono difficilmente impiegabili in VB6 (spesso è necessario ricorrere direttamente alle funzioni API).

    Prova a cercare eventuali soluzioni per il multithreading in Visual Basic 6.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Io faccio qualche cosa del genere
    Dim Adesso As Single
    Adesso = Timer
    Do
    While Timer - Adesso < 0.1 : DoEvents : End While
    Loop While Dir(NomeFile) = ""


    In questo modo il DoEvents permette di tenere scarico il programma durante il ciclo con il quale avevi effettuato lo sleep, e al tempo stesso il dir viene fatto una volta ogni decimo di secondo.

    Se la dir occupa troppo tempo lostesso e non vuoi allungare l'intervallo a mezzo secondo o giù di lì, prova a vedere se il file è presente utilizzando la funzione FileExists della libreria Microsoft Scripting Runtime

  4. #4
    Grazie a tutti e due!
    Ho dato un occhio a soluzioni multithreading, devo cambiare la logica del programma, ma in effetti sembra l'unica soluzione.

    Ho provato anche il secondo esempio (Timer-Adesso), ma il risultato non cambia, programma fluido e cpu a palla.
    Per curiosità ho provato a fare un ciclo (infinito), la cpu sale molto nonostante il doevents.
    codice:
    do
     DoEvents
    Loop
    Quindi il problema sembra essere proprio il ciclo. Nonstante il programma rimanga fluido non posso permettermi di mandare la cpu a palla perchè sono in un ambiente virtuale e blocco gli altri utenti.
    Con la Sleep la cpu rimane libera, ma blocco il programma.
    Capra o cavoli?
    Forse VB non è il linguaggio giusto per salvare entrambi...

    Ciao!!!

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Luciano79
    Con la Sleep la cpu rimane libera, ma blocco il programma.
    Questo perché usi un valore troppo alto per Sleep.

    E' sufficiente indicare anche uno "0" per suggerire al sistema operativo di passare a gestire altri thread di altre applicazioni senza necessariamente introdurre un'attesa inutile nella logica applicativa del programma.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Originariamente inviato da alka
    Questo perché usi un valore troppo alto per Sleep.
    Non ci avevo pensato... Ho provato come dici tu, se imposto 0 il processo occupa il 90% della cpu, ma se imposto 1 scende all' 1% e il programma torna fluido... Grazie!!!

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da Luciano79
    Non ci avevo pensato... Ho provato come dici tu, se imposto 0 il processo occupa il 90% della cpu, ma se imposto 1 scende all' 1% e il programma torna fluido... Grazie!!!
    Sì, il mio intervento voleva solo sottolineare il significato della funzione Sleep, che è rilasciare la CPU e porre in attesa il thread chiamante; con un tempo pari a zero, la CPU viene rilasciata ma il ciclo rimane sempre "esigente" perché non c'è attesa, mentre dando un tempo maggiore di zero le esigenze di CPU diminuiscono e il sistema è in grado di gestire correttamente anche gli altri programmi.

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

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

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.