[C#] Wyjątek w TotalMilliseconds


(system) #1

Witam. Napisałem program do sprawdzania refleksu.

Całość wygląda fajnie, program działa świetnie, ale zdarza się czasem, że wyrzuci wyjątek.

Błąd pojawia się gdzieś przy milisekundach (jak na złość program teraz nie chce rzucić wyjątku):

stopTime = DateTime.Now;

            roznica = stopTime - startTime;

            wartosc = int.Parse(roznica.TotalMilliseconds.ToString());

            textBox1.Text = wartosc + " ms";

            progressBar1.Visible = label1.Visible = label2.Visible = true;

Dlaczego tak się czasem dzieje w tej sytuacji?

Cały projekt można pobrać pod tym linkiem http://wsi.edu.pl/~krzempekpi/WindowsFormsApplication2.rar, jeśli będzie to pomocne w ocenie dlaczego ta aplikacja czasem ma jakieś ale, a czasem nie...


([alex]) #2

A nie dzielisz przypadkiem gdzieś dalej czegoś przez tą różnicę?


(system) #3

nic nie dzielę... Zdaje się że są sytuacje w których w tej linii

wartosc = int.Parse(roznica.TotalMilliseconds.ToString());

nie potrafi sparsować stringa na int. Ale dlaczego?

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public int ile = 0;

        public int czas;

        public int wartosc;

        public DateTime startTime;

        public DateTime stopTime;

        public TimeSpan roznica;

        public double start;

        public double stop;

        public void czasomierz()

        {

            Random R = new Random();

            czas = R.Next(10000) + 2000;

            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

            timer.Interval = czas;

            timer.Tick += new EventHandler(metoda);

            timer.Start();

            label3.Text = "Kliknij przycisk, gdy zmieni się \n kolor tego pola";

        }


        public void metoda(object sender, EventArgs e)

        {

            if (ile < 1)

            {

                ile++;

                panel1.BackColor = Color.Black;

                startTime = DateTime.Now;

            }

        }

        public void wynik()

        {

            stopTime = DateTime.Now;

            roznica = stopTime - startTime;

            wartosc = int.Parse(roznica.TotalMilliseconds.ToString());

            textBox1.Text = wartosc + " ms";

            progressBar1.Visible = label1.Visible = label2.Visible = true;

            if (wartosc < 10000)

            {

                progressBar1.Maximum = 10000;

                label2.Text = "10s";

                if (wartosc <= 1000)

                {

                    progressBar1.Maximum = 1000;

                    label2.Text = "1s";

                }

                progressBar1.Value = wartosc;

            }

            else

            {

                wartosc -= 10000;

                MessageBox.Show("Limit oczekiwania wynosił 10 sekund. Przekroczono o "+wartosc+" ms.");

            }

        }


        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            czasomierz();

        }


        private void button1_Click(object sender, EventArgs e)

        {

            if (ile > 0 && ile < 5)

            {

                wynik();

                ile = 10;

            }

        }

    }

}

(Marcinch7) #4

Nie rozumiem dlaczego z inta robisz stringa i spowrotem inta :stuck_out_tongue:


([alex]) #5
            wartosc = roznica.TotalMilliseconds;textBox1.Text = roznica.TotalMilliseconds.ToString() + " ms"; [/code]

(system) #6

do Marcin:

w którym miejscu ?

do Alex,

muszę sprawdzić


([alex]) #7

A w ilu miejscach przypisujesz coś do wartosc i/lub textBox1.Text?


(Ryan) #8

A czy nie możesz uruchomić z debuggerem w tle i kiedy program się wysypie - sprawdzić dlaczego? Forum to nie interaktywny debugger.


(system) #9

Ryan, uspokój się człowieku. Jak zapewne zauważyłeś piszę że się wysypuje w okolicach linii z milliseconds. I że nie zawsze się pojawia ten błąd.

Po drugie,

sprawdziłem, alex , ale nie działa z Twoim pomysłem. Nie buduje się, podaje komunikat:

cannot implicitly convert type double to int. An explicit conversion exist (are you missing a cast?)

([alex]) #10

wartosc - typ double


(Ryan) #11

A gdzie ja jestem niespokojny? Pytam, czy sprawdziłeś w debuggerze dokładnie która konstrukcja powoduje błąd (kiedy już błąd wystąpi) i jaką wartość mają zmienną. To nieco inna informacja niż "w okolicach".