Avatar billede mjall0w Nybegynder
26. april 2009 - 21:47 Der er 9 kommentarer og
2 løsninger

Wait funktion med Application.DoEvents fryser ofte

Hej.

Jeg har fundet denne smarte Wait funktion et sted på nettet, som gør at man kan sætte et Wait ind i programmet uden at det låser ligesom med Thread.Sleep.
Den ser sådan ud:
        void Wait(int timervalue)
        {
            // set the timer for the number of ms desired
            WaitF.Interval = timervalue;
            // enable the timer and set the timerelapsed flag to false
            WaitF.Enabled = true;
            _timerElapsed = false;
            while (_timerElapsed == false)
            {
              Application.DoEvents();
              System.Threading.Thread.Sleep(5);
            }
        }

Dog fryser programmet utroligt ofte ved at bruge Application.DoEvents(). Har prøvet med og uden Thread.Sleep(), men den fryser lige meget hvad.
Findes der en anden løsning end at bruge Application.DoEvents(), eller hvad kan skyldes mit program ofte fryser når den bruger dene Wait funktion?
Avatar billede arne_v Ekspert
26. april 2009 - 22:22 #1
Gør det ordentligt. Application.DoEvents er noget hø.
Avatar billede mjall0w Nybegynder
26. april 2009 - 22:50 #2
Gør det ordentligt ? :)
Kan du uddybe lidt mere - for mig er Application.DoEvents ordentligt da jeg ikke kender til nogle bedre metoder. :)
Avatar billede arne_v Ekspert
26. april 2009 - 23:09 #3
Du starter en tråd og gør tingene i den tråd - og husker at bruge Invoke hvis du vil opdatere GUI.
Avatar billede arne_v Ekspert
26. april 2009 - 23:10 #4
Google søge ordene er:
  applications doevents evil
Avatar billede aaberg Nybegynder
27. april 2009 - 08:35 #5
Jeg har gode erfaringer med at bruge en BackgroundWorker.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

DoWork eventet i BackgroundWorker klassen kører i en anden tråd, så her har du mulighed for at bruge Thread.Sleep så meget du vil, uden at UI'en fryser, og uden at få alle de problemer du kommer til at få med DoEvents.
Avatar billede mjall0w Nybegynder
28. april 2009 - 17:43 #6
Kan ikke selv lige gennemskue hvordan jeg skal kunne lave en wait funktion med backgroundworker. Er backgroundworker ikke en thread man kan køre, så den kan lave 2 jobs på en gang ?
Vil gerne have den evt. venter 2minutter og brugeren samtidig kan bruge UI'en imens, og så den fortsætter igen efter 2minutter.
Er det overhovedet muligt uden Application.DoEvents?
Avatar billede aaberg Nybegynder
28. april 2009 - 19:13 #7
Måske er det en Timer du skal bruge? En timer sætter du eksempelvis på 2 minutter, så eksekverer den et event efter tidsperioden.

Hvis det ikke er det du skal bruge, så prøv at forklare et konkret eksempel du skal bruge det til.
Avatar billede arne_v Ekspert
29. april 2009 - 04:02 #8
Du skal netop bruge en tråd for at få den effekt.

Her er et eksempel med en manuel tråd:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

public class MainForm : Form
{
    private Label time;
    private Button start;
    private Button abort;
    private Thread t;
   
    public MainForm()
    {
        time = new Label();
        start = new Button();
        abort = new Button();
        SuspendLayout();
        time.Location = new Point(50, 50);
        time.Size = new Size(300, 50);
        time.Font = new Font(FontFamily.GenericSerif, 16.0f);
        start.Location = new Point(50,150);
        start.Size = new Size(200, 50);
        start.Name = "Start Button";
        start.Text = "Start clock";
        start.Click += new EventHandler(StartClick);
        abort.Location = new Point(50,250);
        abort.Size = new Size(200, 50);
        abort.Name = "Abort Button";
        abort.Text = "Abort clock";
        abort.Click += new EventHandler(AbortClick);
        ClientSize = new Size(400, 350);
        Controls.Add(time);
        Controls.Add(start);
        Controls.Add(abort);
        Name = "Main Form";
        Text = "Main Form";
        ResumeLayout(false);
    }
    public void UpdateTime()
    {
        time.Text = DateTime.Now.ToString();
    }
    public delegate void UpdateTimeHandler();
    public void Run()
    {
        while(true)
        {
            if(time.InvokeRequired)
            {
                time.Invoke(new UpdateTimeHandler(UpdateTime));
            }
            else
            {
                Update();
            }
            Thread.Sleep(1000);
        }
    }
    public void StartClick(object sender, EventArgs e)
    {
        t = new Thread(new ThreadStart(Run));
        t.Start();
    }
    public void AbortClick(object sender, EventArgs e)
    {
        t.Abort();         
    }
    [STAThread]
    public static void Main(string[] args)
    {
        Application.Run(new MainForm());
        Application.Exit();
        Environment.Exit(0);
    }
}
Avatar billede mjall0w Nybegynder
29. april 2009 - 22:25 #9
Super. Tusind tak begge 2.
Er det ikke meget fair hvis i deler pointene, da i begge 2 har bidraget positivt :) ?
Avatar billede arne_v Ekspert
29. april 2009 - 22:35 #10
.
Avatar billede aaberg Nybegynder
30. april 2009 - 07:53 #11
:-)
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