Ladepunkte erstellen



  • Abend leudeee ! 😉

    also ich bin neu hier im Forum und wollte schonmal meine
    erste Frage stellen 🙄
    Für meinen Schulprojekt wollte ich in meinem Code einen sogenannten
    Ladepunkte erstellen.
    Hier ein Beispiel (Loading .)nach 5sek (Loading ..) und nochmal 5sek (Loading ...) .Es soll nicht jedes mal neue Zeile ausgeben sondern nur die Punkte sollen sich ändern.
    Hoffe Ihr habt eine Vorstellung !
    Bin noch Newbie in C .

    Was ich benutze :
    -Windows 7
    -Visual Studio 2010 C++

    Mein Programm ist in C geschrieben.

    Mfg
    //Grinch 🙂


  • Mod

    "Loading" ausgeben, sleep für 5 Sekunden, Punkt ausgeben, sleep für 5 Sekunden, Punkt ausgeben, usw.

    Ich nehme hierbei mal an, dass du nicht wirklich etwas lädst. Dann wäre das wesentlich komplizierter. Aber jemand, der Programme schreibt, die 5 Sekunden laden, müsste (hoffentlich) nicht danach fragen.



  • Nach jedem Punkt

    fflush(stdout);
    

    aufrufen, damit der Ausgabepuffer geleert wird.

    Und das mit dem Sleep vergisst du mal besser.



  • Sowas gehört ins WinAPI Forum, da wesentliche von dir beschriebene Funktionalitäten nicht mit (Standard)C realisiert werden können.

    #include <windows.h>
    #include <process.h>
    #include <stdio.h>
    
    void threadf(void*x)
    {
      static i;
      while( i++<3 )
      {
        putchar('.');fflush(0);
        Sleep(5000);
      }
      _endthread();
    }
    
    int main()
    {
      _beginthread(threadf,0,0);
    
      printf("Loading");
    
      Sleep(16000); /* hier deine eigentliche Arbeit verrichten, "Loading-Ausgabe läuft "parallel" ! */
    
      puts("ende");
      return 0;
    }
    

  • Mod

    Ach nun komm, wegen eines einzigem sleep verschieb ich das nicht nach Winapi. Ich denke, das kannst du überstehen. Deine Threadlösung würde natürlich eine Verschiebung rechtfertigen, aber ich habe den Verdacht, der TE sucht bloß eine Möglichkeit, sein Programm langsam erscheinen zu lassen (weil die ganzen coolen Programme so langsam sind 🕶 ). Er möge sich mal äußern, dann kann ich weitersehen, wo der Thread hingehört.



  • Warum sollte das nicht mit C-Stadard Zeugs gehen?
    Lässt sich wunderbar standardmitteltechnisch in langwierige Berechnungen, oder fürs Laden großer Dateien etc. einbinden ... damit der Benutzer nicht denkt, das Proggie sei abgekackt oder so.
    Alle 5 Sekunden dürfte aber für die Optik a bisserl laaaahmaarschig sein.
    Guckst du:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void do_something_with_read_byte ( int c )
    {
    	/* ... */
    	return;
    }
    
    int main ( void )
    {
    	char* filename = "your_very_large_file_needs_display_load_activity.dat"; // Sollte schon einige MBs haben, damit etwas zu sehen ist.
    	char* load_activity[] = { "Loading", "Loading.", "Loading..", "Loading..." };
    	int load_activity_index = 0;
    	const clock_t load_activity_refresh_interval = 200;
    	clock_t last_status_refresh = clock(), now;
    	FILE* fp = fopen ( filename, "rb" );
    
    	if ( fp != NULL )
    	{
    		int c;
    		while (( c = fgetc ( fp )) != EOF )
    		{
    			now = clock();
    
    			if ( now - last_status_refresh > load_activity_refresh_interval )
    			{
    				printf ( "%s   \r", load_activity [ load_activity_index ] );
    				last_status_refresh = now;
    
    				load_activity_index++;
    				if ( load_activity_index >= sizeof ( load_activity ) / sizeof ( load_activity[0] ))
    					load_activity_index = 0;
    			}
    			do_something_with_read_byte ( c );
    		}
    		puts ( "Done.      " );
    		fclose ( fp );
    	}
    	else
    	{
    		perror ( filename );
    	}
    
    	system ( "pause" );	
    	return 0;
    }
    


  • Du hast das Prinzip der Problematik der Erstellung einer Fortschrittsanzeigen nicht verstanden, in den allermeisten Anwendungsfällen weiß man eben nicht (schon gar nicht zur Laufzeit) wielange die betreffende Aktion dauert und schon gar nicht kann man in den Code eingreifen und von innen heraus an den interessanten Stellen nach außen triggern.
    Dein Beispiel hätte ich so auch noch hinbekommen.



  • Wutz schrieb:

    Du hast das Prinzip der Problematik der Erstellung einer Fortschrittsanzeigen nicht verstanden,

    Hahahaha. Scherzkeks.

    Wutz schrieb:

    in den allermeisten Anwendungsfällen weiß man eben nicht (schon gar nicht zur Laufzeit) wielange die betreffende Aktion dauert und schon gar nicht kann man in den Code eingreifen und von innen heraus an den interessanten Stellen nach außen triggern.

    Bei fgetc und ähnlichen Funktionen kann ich die Aktionsdauer ganz gut abschätzen
    und wenn ich mich selbst um die 'Innereien' kümmere, kann ich auch in den Code eingreifen, wie man sieht. Die Behauptung, es wäre (generell) allein mit Standardmitteln nicht möglich, ist schlicht falsch.
    Sicher hast du recht, dass es Anwendugsfälle gibt, in denen das nicht geht, wenn
    man z.B. irgendwelche Bibliotheksfunktionen aufruft etc. dann muss man eben Threads benutzen. 🙄

    Wutz schrieb:

    Dein Beispiel hätte ich so auch noch hinbekommen.

    Toll! 👍
    Ich deins auch. 😃



  • Deine 'Beweisführung' anhand deines einen Beispiels ist naiv und ignorant.
    Von deinem einen Beispiel auf allgemeine und weitaus häufiger vorkommende Situationen schlusszufolgern ist auch nichts anderes, als wenn Buchautoren und Tutorialschreiberlinge aufgrund ihres einen, kleinen Beispiels irgendwelche allgemeinen Schlussfolgerungen ziehen und sie glauben, damit die Allgemeinheit beglücken zu müssen.
    Nehme mal eine simple Datenbank/Suchmaschinenabfrage aus eine Nutzerdialog heraus, (ich habe mal gehört, dass Datenbankabfragen aus Clientanwendungen heraus gar nicht so selten sein sollen):
    Niemand weiß vorher, ob und wenn ja wieviel da zurückkommt und schon gar nicht, wielange die Abfrage dauert.
    Trotzdem möchte der Anwender von dir eine Fortschrittsanzeige haben, und sei es nur eine Wartezeitanzeige.
    Das wird dir mit deiner naiven und ignoranten Herangehensweise niemals gelingen, denn Oracle/Google+Co. werden dir niemals Einblicke in ihre internen Abläufe gestatten und schon gar nicht dynamische Zugriffe auf ihren Code.



  • Dann ist das halt so.

    Trotzdem möchte der Anwender von dir eine Fortschrittsanzeige haben, und sei es nur eine Wartezeitanzeige.

    Eine Animation, die Fortschritt suggeriert, wáhrend der vorgeblich dokumentierte Prozess sich in Wirklichkeit aufgehängt hat, will niemand sehen, auch wenn Microsoft einen das glauben machen will.



  • Danke für alle Antworte !
    War wirklich hilfreich 😃

    Vielen Dank !
    //MfG Grinch



  • Wutz schrieb:

    Von deinem einen Beispiel auf allgemeine und weitaus häufiger vorkommende Situationen schlusszufolgern ist auch nichts anderes, als wenn Buchautoren und Tutorialschreiberlinge aufgrund ihres einen, kleinen Beispiels irgendwelche allgemeinen Schlussfolgerungen ziehen und sie glauben, damit die Allgemeinheit beglücken zu müssen.

    Na schönen guten Morgen auch, LOL. Du vertauschst ein klein wenig die Rollen.
    Ich war doch wohl nicht derjenige, der mit dem

    Prinzip der Problematik der Erstellung einer Fortschrittsanzeigen

    den Versuch eines allgemein beglückenden Rundumschlags gestartet hat. Tststs.

    Wutz schrieb:

    Trotzdem möchte der Anwender von dir eine Fortschrittsanzeige haben, und sei es nur eine Wartezeitanzeige.

    Also, ich kann Deutsch, ich kann lesen. Da steht:

    Grinch schrieb:

    Für meinen Schulprojekt wollte ich in meinem Code einen sogenannten Ladepunkte erstellen.

    Ich habe die relevanten stellen speziell für dich fett hervorgehoben.
    Klar soweit? Also lass mal Google, das Orakel 😃 und Co. vorerst ruhig mal außen vor.
    Ganz weit außen.
    Diesbezüglich hatte ich dir außerdem recht gegeben. Das hast du ignoriert und nennst mich naiv und ignorant.
    Viel merkst du nicht mehr, oder? 🙄



  • Wutz schrieb:

    Sowas gehört ins WinAPI Forum, da wesentliche von dir beschriebene Funktionalitäten nicht mit (Standard)C realisiert werden können.

    #include <windows.h>
    #include <process.h>
    #include <stdio.h>
    
    void threadf(void*x)
    {
      static i;
      while( i++<3 )
      {
        putchar('.');fflush(0);
        Sleep(5000);
      }
      _endthread();
    }
    
    int main()
    {
      _beginthread(threadf,0,0);
    
      printf("Loading");
    
      Sleep(16000); /* hier deine eigentliche Arbeit verrichten, "Loading-Ausgabe läuft "parallel" ! */
    
      puts("ende");
      return 0;
    }
    

    es gibt diverse c umgbebungen(single cpu core), wo es keine threads gibt, bzw. diese emuliert werden müssen.


Log in to reply