Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    79

    [C++] Aggiornamento console senza (o minimizzando) lo sfarfallio

    Salve ragazzi,

    innanzitutto auguri di buon anno a tutti e di buona continuazione delle feste che spero non stiate passando a lavorare, come me


    Sto facendo un programma in c++ che avrebbe bisogno ad essere onesti di un bel timer, ma per ora lo sto implementando usando la sleep(int) e il system("cls") per la pulitura dello schermo.

    Il problema è che sto ottenendo un effetto sfarfallio incredibile degli elemnti su schermo a console che vengono aggiornati (tutti). Volevo evitare di avere o far venire a chiunque usi il programma degli attacchi epilettici, stile Simpson in Giappone , c'è qualche funzione interessante per questo?

    Grazie.
    "La fortuna aiuta gli audaci"
    (e non gli adagiati)

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    cs dovrebbe fare il tuo programma?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Su che piattaforma sei?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    Su che piattaforma sei?
    Domanda lecita e che approvo.

    Ovviamente in campo unix la sintassi si avvale di clear, in ambiente Windows le possibilità sono varie:

    codice:
    #include <stdlib.h>
    system("cls");
    oppure
    codice:
    #include <conio.h>
    scrclr();
    oppure altro metodo più efficace (secondo MSDN)
    codice:
    void ClearScreen()
    {
    	COORD coordScreen = {0, 0};    	DWORD cCharsWritten;
    	CONSOLE_SCREEN_BUFFER_INFO csbi;
    	DWORD dwConSize;
    	if(!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
    	{
    		return;
    	}
    	dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    	if(!FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten))
    	{
    		return;
    	}
    	if(!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
    	{
    		 return;
    	}
    	if(!FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten))
    	{
    		return;
    	}
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordScreen);
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C++] Aggiornamento console senza (o minimizzando) lo sfarfallio

    Originariamente inviato da Loue
    Sto facendo un programma in c++ che avrebbe bisogno ad essere onesti di un bel timer, ma per ora lo sto implementando usando la sleep(int) e il system("cls") per la pulitura dello schermo.
    Non usare la sleep. Puoi sfruttare, se non erro, time.h. Se puoi evita la funzione system.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    79
    Grazie a tutti dei consigli e dell'interessamento.

    Il programma deve stampare dei caratteri a schermo di un array bidimensionale che devono essere aggiornati ogni 30-50 ms dato che deve eseguire alcuni algoritmi a seconda dei tasti che vengono premuti e modificare in base a quelli il contenuto della matrice. 30-50 ms è relativo perchè anche io sto cercando una frequenza di aggiornamento ottimale, solo per evitare lo sfarfallio.

    Sono su Windows 7, sto usando QT Creator.

    Provo ad eseguire i codici postati da MdE2005, evitando come dice simo il system e vi dico il risultato.

    Ancora grazie.
    "La fortuna aiuta gli audaci"
    (e non gli adagiati)

  7. #7
    Utente di HTML.it L'avatar di XBarboX
    Registrato dal
    Dec 2008
    Messaggi
    121
    Allora, ho capito benissimo il tuo problema. Purtroppo la console di windows è molto lenta a causa di troppi controlli sulla sicurezza. Se vuoi fare un buon timer senza sfarfallio hai due possibilità:
    1)Il timer segna al massimo i secondi (così farai solo una clear o cls ogni secondo evitando troppi refresh della console)
    2)Ti affidi ad un'altro linguaggio con interfaccia grafica come vb .net c# java delphi...

    Anche io volevo farmi un bel timer ma ho subito visto che in c++ sulla console fa schifo

    Se proprio vuoi farlo in c++ usa le qt, che ti permettono di fare gui senza tanto sforzo

  8. #8
    Secondo me il problema sta, come al solito, nella cancellazione totale dello schermo prima di ridisegnare. Se devi semplicemente aggiornare una porzione dello schermo ti conviene spostarti lì (con le apposite API della console su Windows, con le sequenze di escape su Linux) e sovrascrivere quello che hai già scritto prima. Ovviamente per avere buoni risultati sarebbe bene che la parte da sovrascrivere fosse ben delimitata.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Secondo me il problema sta, come al solito, nella cancellazione totale dello schermo prima di ridisegnare. Se devi semplicemente aggiornare una porzione dello schermo ti conviene spostarti lì (con le apposite API della console su Windows, con le sequenze di escape su Linux) e sovrascrivere quello che hai già scritto prima. Ovviamente per avere buoni risultati sarebbe bene che la parte da sovrascrivere fosse ben delimitata.
    Stessa cosa che pensavo io: SetConsoleCursorPosition
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    79
    Volevo ringraziare tutti degli utili interventi.

    Alla fine siccome il programma mi è stato richiesto da in C++ da console ho risolto con la setConsoleCursorPosition, ridisegnando solo quello che è utile ai fini del refresh.
    "La fortuna aiuta gli audaci"
    (e non gli adagiati)

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.