Autor Beitrag
ErikLange
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Mi 12.05.10 11:40 
Hey Leute, ich hab ein kleines Problem.
Ich habe eine Stopwatch in mein Programm eingebaut, diese funktioniert von der Sache her auch, jedoch misst sie nicht das was ich wollte:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
static void Main(string[] args)
        {
            
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            disk k = new disk();
            k.disktester();

            stopwatch.Stop();
            TimeSpan ts = stopwatch.Elapsed;
            string elepsedTime = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

            Console.WriteLine(elepsedTime, "Runtime");
            Console.ReadKey();

bei "k.disktester" öffenet sich ein Konsolenfenster mit einer Anwendung

Stopwatch öffnet sich also in der Konsolenanwendung und Disktester in einem neuen Fenster.
Stopwatch misst immer nur ein paar millisekunden, also scheinbar so lange wie der PC braucht um die Zeitmessung zu starten und zu stoppen. Dass da noch ein Programm läuft interessiert Stopwatch gar nicht.
Habt ihr eine Idee wie ich das lösen könnte?

MFG


Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Mi 12.05.2010 um 11:42
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 12.05.10 11:45 
user profile iconErikLange hat folgendes geschrieben Zum zitierten Posting springen:
Dass da noch ein Programm läuft interessiert Stopwatch gar nicht.
Kann man ihr nicht wirklich vorwerfen, oder ;) ?

Wie startest du denn dieses zweite Programm? Bei der Process-Klasse gäbe es WaitForExit.

_________________
>λ=
ErikLange Threadstarter
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Do 13.05.10 10:32 
Guten Morgen
hab gar nicht mitbekommen das die Antwort so schnell kam,
ich werds ma ausprobieren, da ich das Programm wirklich über Process starte.
Aber nicht über die Feiertage, kann erst am Montag wieder an dem Programm arbeiten.
Schönen Männertag euch allen :beer:
ErikLange Threadstarter
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Mo 17.05.10 13:21 
Hey
ich hab die "WaitForExit" mal nachgeschaut, aber so richtig scheint die nicht in mein Programm zu passen.
Könntest du mir vieleicht helfen diese Methode mit reinzufügen, da ich nicht wirklich weis wo sie reingehört etc.
Wenn jemand anderes eine Idee hätte wäre ich auch sehr dankbar
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
        static void Main(string[] args)
        {

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            disk k = new disk();
            k.disktester();

            stopwatch.Stop();
            TimeSpan ts = stopwatch.Elapsed;
            string elepsedTime = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
            Console.WriteLine(elepsedTime, "Runtime");
            Console.ReadKey();
           }

        public class disk
        {
            public void disktester()

            {               
                ProcessStartInfo disk = new ProcessStartInfo(@"D:\rdfc.exe", Path.Combine(@"d:\""datei.txt 200 MB overwrite"));
                disk.WindowStyle = ProcessWindowStyle.Normal;
                Process.Start(disk);                
            }
        }
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 17.05.10 13:27 
Hallo,

da dein "Programm" lediglich ein anderes Programm aufruft musst du auf das andere Programm warten. Das machst du eben mit der WaitForExit methode.

Dementsprechend musst du die disktester Methode anpassen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public TimeSpan TestDiscSpeed(int size)
            {               
                Stopwatch watch = new Stopwatch();
                ProcessStartInfo disk = new ProcessStartInfo(
                    @"D:\rdfc.exe",
                    Path.Combine(@"d:\"string.Format("datei.txt {0} MB overwrite", size)));
                disk.WindowStyle = ProcessWindowStyle.Normal;
                watch.Start();
                disk.Start();
                disk.WaitForExit();
                watch.Stop();
                return watch.Elapsed;
            }


Gruß
ErikLange Threadstarter
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Mi 19.05.10 10:13 
Ohje ich hab ewig gebraucht um zu sehen warum das nciht klappt.... bei mir hat es nie die "WaitForExit"-Methode als Vorschau angezeigt, da ich nicht die Process Klasse nutze sondern die ProcessStartInfo Klasse
Gibs da sowas ähnliches? Bzw. wäre das einfach die Klasse zu ändern?
Außerdem muss da irgendwo ein kleiner Fehler drinne sein, da die Stopuhr nun nicht mehr misst.
Wäre nett wenn ihr da ma drüber schauen könntet.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
class Program
    {
        static void Main(string[] args)
        {

            TimeSpan ts = new TimeSpan();
            string zeit = Convert.ToString(TestDiscSpeed());
            zeit = string.Format("{0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            Console.WriteLine(zeit, "Runtime");
            Console.ReadKey();
        }
                   
       
            static TimeSpan TestDiscSpeed()
            {               
                Stopwatch watch = new Stopwatch();
                disk dk = new disk(); 
                watch.Start();
                dk.disktester();
                Process proc = new Process();
                proc.WaitForExit(); 
                watch.Stop();
                return watch.Elapsed;
            }   
      }
        public class disk
        {
            public void disktester()

            {               
                ProcessStartInfo disk = new ProcessStartInfo(@"D:\rdfc.exe", Path.Combine(@"d:\""datei.txt 100 MB overwrite"));
                disk.WindowStyle = ProcessWindowStyle.Normal;
                Process.Start(disk);                
        }

        }
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 19.05.10 10:26 
Oh man, das ist übel. Kennst du überhaupt die Grundlagen von Programmieren? Was eine Methode/Rückgabewert ist?

Bitte schau dir mal ein Programmierbuch wie zum Beispiel C#, das ist frei verfügbar, an.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
       static void Main(string[] args)
        {

            TimeSpan ts = TestDiscSpeed();
            Console.WriteLine(string.Format("{4} {0:00}:{1:00}:{2:00}:{3:00}:", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds, "Runtime"));
            Console.ReadKey();
        }


Gruß
ErikLange Threadstarter
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Mi 19.05.10 14:13 
Hey Daniel
ich musste mir jetzt so alla Crashkurs das schnell selber beibringen, damit ich die paar Zeilen tippen kann, die theoretischen Grundlagen, was was ist etc. usw. kann ich noch nicht, da haste Recht. Ich will dann im Sommer mir richtig C# beibringen.
Diese Woche bin ich aber noch unter Druck wenigstens das halbwegs hinzubekommen.
Das Programm funktioniert nun wieder, aber halt auch nur so wie am Anfang des Threads :P

Ich GLAUBE du hattest nen kleinen Fehler bei dir drinne:
Zitat:
public TimeSpan TestDiscSpeed(int size)
{
Stopwatch watch = new Stopwatch();
ProcessStartInfo disk = new ProcessStartInfo(
@"D:\rdfc.exe",
Path.Combine(@"d:\", string.Format("datei.txt {0} MB overwrite", size)));
disk.WindowStyle = ProcessWindowStyle.Normal;
watch.Start();
disk.Start();
disk.WaitForExit();
watch.Stop();
return watch.Elapsed;

disk kommt von ProcessStartInfo und dort geht scheinbar/meines Wissens die WaitForExit-Methode nicht.
Die geht nur bei Process.
Wüsstest du wie das bei ProccessStartInfo geht? Hab leider keine Idee, und meine Kenntnisse sind auch begrenzt als das ich das innerhalb ein paar Stunden einfach mal so umschreiben könnte auf Process :(
Könntest du mir vieleicht nochmal helfen? :oops:
Wenn das Programm die Woche fertig ist, kann ich auch anfangen mir C# von Grund auf beizubringen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 19.05.10 14:21 
Hallo ErikLange,

die Methode 'Process.Start(...)' gibt dir den Process zurück, also:
ausblenden C#-Quelltext
1:
2:
Process process = Process.Start(disk);
process.WaitForExit();

Solche Grundlagen lernt man aber auch selber, wenn man in die MSDN-Dokumentation schaut...
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 19.05.10 14:38 
Ja, das hat er ja erklärt ... also hoffentlich wird bald Sommer ;))

Hier mal eine Zusammenfassung:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
    public class Drive
    {
        private const string CopyExecutable = @"D:\rdfc.exe";
        private const string TempFile = @"tempfile.txt";
        public string Path { get; set; }

        static void Main(string[] args)
        {
            Drive driveD = new Drive(@"D:\");

            TimeSpan ts = driveD.TestDiscSpeed(200);

            Console.WriteLine(string.Format(
                "{0}MB nach {1} in {2:00}h {3:00}m {4:00}s {5:00}ms kopiert ({6}MB/sec).",
                200, driveD, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds, 200 / ts.TotalSeconds));
            Console.ReadKey();
        }

        public Drive(string path)
        {
            Path = path;
        }

        public TimeSpan TestDiscSpeed(int mb)
        {
            Stopwatch watch = new Stopwatch();
            Process proc = new Process
            {
                StartInfo = new ProcessStartInfo(
                      CopyExecutable, System.IO.Path.Combine(Path, TempFile + " " + mb + " MB overwrite"))
            };

            watch.Start();
            proc.Start();
            proc.WaitForExit();
            watch.Stop();
            return watch.Elapsed;
        }
    }
ErikLange Threadstarter
Hält's aus hier
Beiträge: 11

Win 7
C# (VS 2008)
BeitragVerfasst: Mi 19.05.10 14:55 
Also ich muss sagen... ich bin beeindruckt, es funktioniert auf Anhieb.
Es ist zwar ganz anders als meins, deshalb warscheinlich auch richtig :P aber findes cool das ich nun doch was vorzuzeigen hab.
Nun noch eine kleine Schleife einbauen (damit der Test 5ma abläuft und man den Mittelwert ausrechnen kann) , das müsste ich noch hinbekommen ^^
Da bedanke ich mich ma und werde mir ma ne Weile das Programm anschauen und dadurch mein Verständnis für die Sprache erweitern.
:)
DANKE :!:
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 19.05.10 15:07 
Besser wäre es, wenn du die Funktionalität von rdfc.exe in einer .NET Methode abbildest (beliebig Daten erzeugen und in die Datei schreiben). Dann wärst du nicht auf diesen externen Teil angewiesen und das Programm ist nicht so Fehler anfällig. Das kannst du dir ja für den Sommer vornehmen ;)

Viel Erfolg