zeitinterval
-
Hallo @ all!
Ich wollte mal versuchen ein Programm zu schreiben, dass praktisch das Formatieren einer Festplatte simuliert (also so wie unter Windows format x:)...
Nur hab ich leider keine Ahnung wie ich das machen kann, dass die zahl praktisch alle 3-4 Sekunden um eins erhöht wird, also so ne Art Timeout (wie in JavaScript window.setTimeout() z.b.).
Hoffe ihr versteht was ich mein und könnt mir helfen...
gruß
gemuse
-
such mal nach sleep im Forum deines Betriebssystems.
-
ok, hab schonmal was kleines hinbekommen, jedoch möchte ich, dass die Zahlen nicht andeinandergereit werden, sonder eben wie bei "format c:" nur die jeweilige zahl ausgegeben wird. Könnt ihr mir n Tip geben wie ich das machen kann?
gruß
gemusebisheriges \1:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; for(i=0; i<=100; i++) { printf("%i", i); sleep(1000); } getch(); }
-
mit \r kommst du wieder an den Anfang der Zeile
-
Das mit '\r' und immer wieder die ganze Zeile neu schreiben ist meiner Meinung nach nicht so schnell wie "\b\b\b%i" bzw. natürlich dann i 3-stellig oder zwei \b und i 2-stellig machen und nach der Schleife 100% komplett angeben - bringt mehr Performance.
Natürlich ist das heutzutage egal, aber auf den Rechnern wo man wirklich glaubt die Festplatte wird formatiert (also meistens altes DOS-Betriebssystem => meistens natürlich für DOS ein schwacher Rechner) ist es schon wichtiger auf die Performance zu schauen.
Wir haben das Formatieren mal auf deiner alten Festplatte durchgeführt und jedes Zeichen + Position gespeichert. Auch das Geschwindigkeit/Größe-Verhältnis hatte gestimmt. Sah wirklich echt aus und wanderte dann in einer Pause in das Loginscript unseres Professors *g*
Wenn das Programm unter DOS laufen soll kann ich dir noch ein paar Tips geben um das Abbrechen mit STRG+C zu umgehen - imho ganz witzig was wir da so an Tricks gebastelt haben :D.
MfG SideWinder
-
SideWinder schrieb:
Das mit '\r' und immer wieder die ganze Zeile neu schreiben ist meiner Meinung nach nicht so schnell wie "\b\b\b%i" bzw. natürlich dann i 3-stellig oder zwei \b und i 2-stellig machen und nach der Schleife 100% komplett angeben - bringt mehr Performance.
Wir reden hier über Mikrosekunden bei einer Anzeige, die alle 3..4 Sekunden aktualisiert werden soll. Manchmal muss man Prioritäten setzen. Wenn man wirklich Performance wollte, dann würde man die Anzeige über BIOS-Funktionen bzw. conio.h machen (gotoxy, cprintf und Konsorten)
-
Das mit STRG+C wäre mal ganz interessant zu wissen
bzw. allgemein würd ich gern mal wissen, wie man Tastaturkombinationen einliesst. Z.B. könnte ich ja ein Menü machen in dem man STRG+F drücken muss um weiterzukommen, wie würde man das implementieren?gruß
gemuse
-
gemuse schrieb:
Das mit STRG+C wäre mal ganz interessant zu wissen
bzw. allgemein würd ich gern mal wissen, wie man Tastaturkombinationen einliesst. Z.B. könnte ich ja ein Menü machen in dem man STRG+F drücken muss um weiterzukommen, wie würde man das implementieren?gruß
gemuse1. Wenn du keine Systemfunktionen aufrufst reichte unter Pascal ein einfaches "SetCBreak(FALSE)" - musst du ein äquivalent für 16bit-C suchen. Solltest du Systemfunktionen benötigen baust du dir ein Programm, welches unter DOS ein anderes Programm aufruft solange doserrno keinen "STRG+C-Fehler" enthält (Abbruch mit STRG+C ist ein bestimmter Fehlercode). Das das Formatieren bei STRG+C wieder von vorne beginnt ist ziemlich egal. Unter Pascal waren das die Anweisungen:
WHILE(doserrno=0) // weiß den Fehlercode nicht mehr, == ist in TP = ! BEGIN SwapVectors; exec(Programm,Parameter); SwapVectors; END
Sozusagen ein Überbau das das richtige Programm aufruft bis das Programm nicht mit dem Code STRG+C beendet hat. Funktionierte unter MS-DOS 6.22 einwandfrei!
Und am Ende vom Programm nicht vergessen: User ausloggen und Flag in einer Datei setzen. Wenn der User wieder einloggt kommt diesmal kein Format mehr sondern die Meldung "Unformatted drive - do you want to format it?" Wenn nein ausloggen wenn ja wieder Programm wiederholen - ist witzig :D.
2. Tastenkombinationen kannst du einfach einlesen (glaub das findest du sogar in der Konsolen-FAQ):
[cpp]
char c (getch());if(c==0 || c==0xE0) // siehe Konsolen-FAQ warum 0xE0
{
c = getch();// Erweiterte Sondercodes per switch(c) abfragen
}
else
{
// Normale Codes per switch(c) abfragen
}
[/code]
STRG+F liefert so einen erweiterten Code. Findest du ebenfalls in der FAQ, welcher Code das ist.Geht aber imho beides nicht mit dem Standard.
MfG SideWinder
-
um strg+c abzufangen (weiss aber nicht ob das auch unter DOS geht)
#include <signal.h> void sig(int s) { } int main() { if(signal(SIGTERM,sig)==SIG_ERR) return 1; for(;;) { } return 0; }
-
So, ich hab nun mal mit eurer Hilfe so n kleines AnfängerProgramm geschrieben, dass das Formatieren eines Laufwerks simuliert. Ich poste mal meinen Code hier und würde mich freuen, wenn ihr mir vielleicht n paar Tipps geben könntet um das Programm zu erweitern und zu verbessern. Z.B. hab ich versucht zu überprüfen, ob wirklich als Parameter x: angegeben wurde, also wirklich eine Laufwerkangabe, aber ich wusste nicht genau wie. Oder, was mich mal interessieren würde, wie das bei dem richtigen format -Programm von Microsoft funktioniert. Wie überprüft ds programm ob das Laufwerk tatsächlich existiert?
hoffe ihr habt mir n paar Tipps
grußgemuse
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char format[5]; int i; if(argc <2 || argc >2) { printf("Ungueltgie Parameteranzahl\n"); exit(1); } else { printf("ACHTUNG: ALLE DATEN AUF DEM \nFESTPLATTENLAUFWERK %s GEHEN VERLOREN!\n", argv[1]); printf("Formatierung durchfuehren (J/N)?"); gets(format); if(strcmp("j", format)== 0) { for(i=0; i<=100; i++) { printf("%i %% formatiert\r", i); sleep(1000); } printf("\n\nFestplatte wurde erfolgreich formatiert"); } else { exit(1); } } getch(); }
-
Hab mal etwas editiert dran *g*:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char format[5]; int i; if(argc <2 || argc >2) { // Wie wärs mit if(argc==1)? printf("Ungueltgie Parameteranzahl\n"); exit(1); } else { printf("ACHTUNG: ALLE DATEN AUF DEM \nFESTPLATTENLAUFWERK %s GEHEN VERLOREN!\n", argv[1]); // Sicher mit der Großschreibung? printf("Formatierung durchfuehren (J/N)?"); // Y/N gets(format); if(strcmp("j", format)== 0) { for(i=0; i<=100; i++) { printf("%i %% formatiert\r", i); sleep(1000); // je nach größe des laufwerks machen - kommt sonst nicht realistisch rüber :D - musst du aber os-abhängig machen } printf("\n\nFestplatte wurde erfolgreich formatiert"); } else { exit(1); } } getch(); // hier kannst du entweder wie wir den user ausloggen oder wie ein freund von mir eine kleine "dos"-box hinmachen. du zeigst laufwerke an die es gibt aber gibst den text aus als wären keine Files da. Musst halt cd, etc. implementieren - ist ja kein problem. Bei allen anderen machst du einfach "Befehl oder Dateiname nicht gefunden." :D }
[/quote]
-
HI!
hab das nun mal gemacht, ein DOS-Prompt implementiert, jedoch recht einfach. Hab dazu eine ENdlosschleife verwendet, ist halt nicht besonders schön, köntne man das auch anders machen?gruß
gemuse#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char format[5], eingabe[80]; int i; if(argc != 2) { printf("Ungueltgie Parameteranzahl\n"); exit(1); } else { printf("ACHTUNG: ALLE DATEN AUF DEM \nFESTPLATTENLAUFWERK %s GEHEN VERLOREN!\n", argv[1]); printf("Formatierung durchfuehren (J/N)?"); gets(format); if(strcmp("j", format)== 0) { for(i=0; i<=100; i++) { printf("%i %% formatiert\r", i); sleep(100); } printf("\n\nFestplatte wurde erfolgreich formatiert\n\n"); while(1) { printf("C:\\>"); gets(eingabe); printf("\nBefehl oder Dateiname nicht gefunden\n"); } } else { exit(1); } } getch(); }