2015-10-04, 12:33
  #1
Bannlyst
Jag vill utveckla ett program. Detta program ska ha en timer, och varje gång timer startas (t.ex. med en startknapp) så vill jag att ett helt slumpmässigt nummer ska användas som interval. Sedan för varje gång timer gör det den ska göra, så ska ett nytt slumpmässigt nummer genereras och användas som interval.

För att förklara lite mera:
* Starta timer1, nummer "1281" genereras. "1281" är millisekunder och används som interval för timer1.
* När dessa "1281" millisekunder har passerat så genereras ett nytt nummer, t.ex. "928". "928" blir då en ny interval för timer1.

Detta pågår tills jag trycker på stopp. Jag vill att det slumpmässiga numret ska vara från 100 millisekunder till 3000 millisekunder.

Tack så mycket för er hjälp.
Citera
2015-10-04, 12:40
  #2
Medlem
vtcs avatar
Kan du visa hur ditt program ser ut hittills? Exakt vad har du problem med?
Citera
2015-10-04, 12:49
  #3
Bannlyst
Citat:
Ursprungligen postat av vtc
Kan du visa hur ditt program ser ut hittills? Exakt vad har du problem med?
Hur detta nummer ska genereras. Jag förstår inte hur jag använder random-metoden i en timer.
Citera
2015-10-04, 13:01
  #4
Medlem
vtcs avatar
Citat:
Ursprungligen postat av Grina
Hur detta nummer ska genereras. Jag förstår inte hur jag använder random-metoden i en timer.
Så hur ser ditt program ut då? Det blir mycket enklare att hitta vad du gör fel om du visar din kod.
Citera
2015-10-04, 13:09
  #5
Bannlyst
Citat:
Ursprungligen postat av vtc
Så hur ser ditt program ut då? Det blir mycket enklare att hitta vad du gör fel om du visar din kod.
Kod:
using System;
using System.Windows.Forms;

namespace AutoAlch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Interval = random.Next();
            timer1.Start();
            label1.Visible = true;

        }
        private Random random = new Random();

        void Interval(object sender, EventArgs e)
        {
            timer1.Interval = (random.Next(int.Parse(textBox1.Text), int.Parse(textBox2.Text)) * 10);
            SendKeys.Send(label1.Text + ", " + timer1.Interval + "{enter}");
        }
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            label1.Visible = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("Tick");
        }
    }
}

Jag är noll säker på att det ens är rätt. Det är kopierat från stackoverflow och modifierat lite granna. "MessageBox.Show" är enbart för debug, för att se hur timern fungerar.
Citera
2015-10-04, 13:15
  #6
Medlem
vtcs avatar
Okej. Hur har du försökt att angripa problemet? Vad får du för resultat av att köra koden och varför tror du att eventuella problem uppstår?
Citera
2015-10-04, 13:34
  #7
Bannlyst
Citat:
Ursprungligen postat av vtc
Okej. Hur har du försökt att angripa problemet? Vad får du för resultat av att köra koden och varför tror du att eventuella problem uppstår?
När jag kör programmet så poppar "MessageBox" upp med 10 millisekunders mellanrum (timern är inställd på det). Det jag nu vill förändra är att på något sätt i koden göra så att för varje gång timern är färdig så börjar den om med ett nytt intervall, och det vet jag inte hur jag ska göra.

Kod:
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Interval = ?
        }
Såhär kan jag tänka mig att början ska se ut.
Citera
2015-10-04, 14:10
  #8
Medlem
Citat:
Ursprungligen postat av Grina
När jag kör programmet så poppar "MessageBox" upp med 10 millisekunders mellanrum (timern är inställd på det). Det jag nu vill förändra är att på något sätt i koden göra så att för varje gång timern är färdig så börjar den om med ett nytt intervall, och det vet jag inte hur jag ska göra.

Kod:
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Interval = ?
        }
Såhär kan jag tänka mig att början ska se ut.

Skapa ett Random-objekt.

[PHP]var random = new Random();[/PHP]

Sedan anropar du metoden Next(a, b) (i timer1_Tick) som returnerar ett slumpmässigt heltal mellan a och b.

timer1.Interval = random.Next(100, 3000);

Tänk på att Interval ska specificeras i ms (TS verkar ha förstått det, men rent allmänt).

Jag har testat detta i Visual Studio och det fungerar bra.

EDIT
Referens https://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx
__________________
Senast redigerad av Realiserad 2015-10-04 kl. 14:20.
Citera
2015-10-04, 15:25
  #9
Bannlyst
Citat:
Ursprungligen postat av Realiserad
Skapa ett Random-objekt.

[PHP]var random = new Random();[/PHP]

Sedan anropar du metoden Next(a, b) (i timer1_Tick) som returnerar ett slumpmässigt heltal mellan a och b.

timer1.Interval = random.Next(100, 3000);

Tänk på att Interval ska specificeras i ms (TS verkar ha förstått det, men rent allmänt).

Jag har testat detta i Visual Studio och det fungerar bra.

EDIT
Referens https://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx
Tack för din hjälp, det var själva random-funktionen jag behövde hjälp med. Jag kan nog fixa det nu
Citera
2015-10-04, 16:23
  #10
Bannlyst
Citat:
Ursprungligen postat av vtc
Så hur ser ditt program ut då? Det blir mycket enklare att hitta vad du gör fel om du visar din kod.

Citat:
Ursprungligen postat av Realiserad
Skapa ett Random-objekt.

[PHP]var random = new Random();[/PHP]

Sedan anropar du metoden Next(a, b) (i timer1_Tick) som returnerar ett slumpmässigt heltal mellan a och b.

timer1.Interval = random.Next(100, 3000);

Tänk på att Interval ska specificeras i ms (TS verkar ha förstått det, men rent allmänt).

Jag har testat detta i Visual Studio och det fungerar bra.

EDIT
Referens https://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx

Kod:
using System;
using System.Windows.Forms;

namespace AutoAlch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
        }
        Random rnd = new Random();

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Interval = rnd.Next(100, 1200);
            MessageBox.Show("Tick");
        }
    }
}

Det fetmarkerade = den perfekta lösningen på mitt problem. Tänk att det var så enkelt, tack!
Citera
2015-10-04, 19:21
  #11
Medlem
vtcs avatar
Citat:
Ursprungligen postat av Grina
Kod:
using System;
using System.Windows.Forms;

namespace AutoAlch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
        }
        Random rnd = new Random();

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Interval = rnd.Next(100, 1200);
            MessageBox.Show("Tick");
        }
    }
}

Det fetmarkerade = den perfekta lösningen på mitt problem. Tänk att det var så enkelt, tack!
Gratulerar! Du löste det dessutom på egen hand - det är bra mycket nyttigare än att få ett färdigt stycke kod i handen
Citera
2015-10-05, 01:34
  #12
Medlem
Citat:
Ursprungligen postat av Grina
När jag kör programmet så poppar "MessageBox" upp med 10 millisekunders mellanrum (timern är inställd på det). Det jag nu vill förändra är att på något sätt i koden göra så att för varje gång timern är färdig så börjar den om med ett nytt intervall, och det vet jag inte hur jag ska göra....

Ja, men var observant på att skärmen har vanligen bara som bäst kanske drygt 100 Hz som refresh rate, det innebär att all grafik som försöker gå fortare än så egentligen inte gör det, CPUn går med GHz hastighet, alltså cirka 10 milj ggr snabbare än vad skärmen kan prestera.

Det är därför det är rätt så meningslöst att ha en grafisk timer på 10 ms - det är precis på gränsen för vad skärmen klarar av, din senare kod är dock ju väl inom ramen för vad de flesta skärmar klarar av utan problem.

Beroende på hur man använder Timer objektet så rekommenderas ibland att Timern disablas tills att användaren klickar OK för att fortsätta (för att undvika att skärmen fylls av obesvarade MessageBoxes),
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in