Avatar billede netro Nybegynder
17. februar 2007 - 18:05 Der er 3 kommentarer og
1 løsning

Vis eksekveringstid for et stykke kode

Hvordan kan jeg på en form vise, hvor lang tid noget givent kode er om at eksekvere? Den skal ikke bare vise tallet bagefter men tælle op fx hvert sekund.
Avatar billede hmortensen Nybegynder
17. februar 2007 - 18:18 #1
Tror ikke jeg helt forstår din sidste sætning, men sådan her kan du få tiden for et givent stykke af koden.

DateTime start = DateTime.Now;
// Kode der skal tidsberegnes
DateTime slut = DateTime.Now;
TimeSpan forskel = slut - start;

så burde du kunne bruge forskel.TotalSeconds
Avatar billede netro Nybegynder
17. februar 2007 - 18:39 #2
Klart nok, men jeg vil gerne have tallet til at opdatere samtidig med, at koden eksekveres. Altså:

- Start på tung kode
- Opdatér tal på form: 1 sek
- Opdatér tal på form: 2 sek
- Opdatér tal på form: 3 sek
- Slut på tung kode
Avatar billede r9 Nybegynder
17. februar 2007 - 22:09 #3
hmortensen:

Snakker vi om WindowsForms?

Normal vil du smide kode som tager langt tid at eksekvere i en seperat traad.Og saa have en anden traad eller timer som tjekker om din worker thread stadig er aktiv.

Da windows forms er singlethreaded, saa skal din traad (den som tjekker status) huske at invoke UI traaden naar den opdater UI'en. Du kan ogsaa benytte "SynchronizingObject" paa "Timer" som goer dette for dig.

Her er et eksempel: (en form med en label og en button)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TimerOnForm
{
    public partial class Form1 : Form
    {
        private DateTime m_startTime;
        private System.Timers.Timer timer;
        System.Threading.Thread thread;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {           
            //setup timer
            timer = new System.Timers.Timer();
            timer.SynchronizingObject = this;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = 500;
            timer.Start();           

            //setup thread       
            thread = new System.Threading.Thread(new System.Threading.ThreadStart(DoLongWork));
            thread.IsBackground = true;
            thread.Start();
        }

        //update UI
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (thread.IsAlive)
            {
                DateTime now = DateTime.Now;
                TimeSpan diff = now - m_startTime;
                this.label1.Text = "Seconds: " + diff.Seconds;
            }
        }

        //do long work
        private void DoLongWork()
        {
            this.Invoke(new MethodInvoker(DisableButton));
            m_startTime = DateTime.Now;
            System.Threading.Thread.Sleep(10000);
            this.Invoke(new MethodInvoker(EnableButton));
        }

        private void EnableButton()
        {
            this.button1.Enabled = true;
        }
       
        private void DisableButton()
        {
            this.button1.Enabled = false;
        }

    }
}
Avatar billede netro Nybegynder
18. februar 2007 - 00:33 #4
Perfekt. Lige hvad jeg søgte.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester