Προς το περιεχόμενο

C# Thread.Sleep() πρόβλημα


Haros

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα, έχω τον ακόλουθο κώδικα σε C# (ναι δεν κάνει τίποτα ουσιαστικό)

 

>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;
using System.Threading;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       private Thread t;

       public Form1()
       {
           InitializeComponent();
       }



       private void Form1_KeyDown(object sender, KeyEventArgs e)
       {
           if (e.KeyCode == Keys.A)
           {
               ThreadStart del = new ThreadStart(dothis);
               t = new Thread(del);
               t.Start();
           }
       }

       public void dothis()
       {
           while (t.IsAlive)
           {
               toolStripStatusLabel1.Text = toolStripStatusLabel1.Text + "1";
               Thread.Sleep(5000);
           }
       }

       private void Form1_KeyUp(object sender, KeyEventArgs e)
       {
           if (e.KeyCode == Keys.A)
           {
               t.Abort();
           }
       }


   }
}

 

Όπως βλέπετε όσο ένα κουμπί είναι πατημένο (το "Α" συγκεκριμένα) εκτελείται ο κώδικας του dothis() ο οποίος είναι σε loop. Ο κώδικας του dothis() δεν κάνει τίποτα παρά να γράφει όση ώρα εκτελείτε (δηλαδή όση ώρα είναι πατημένο το "Α", "1" σε ένα Label.

Μόλις αφήσουμε το "Α" τότε κάνει abort το thread σταματώντας και την loopα.

 

Το πρόβλημα μου είναι ότι φαίνεται σαν το sleep των 5sec να μην λειτουργεί. Ενώ κανονικά θα έπρεπε όσο κρατάω πατημένο το "Α" ανά 5 sec να γράφει ένα "1" στο label τώρα το κάνει κατευθείαν σαν να μην υπάρχει η εντολή Thread.Sleep().

 

Καμία άποψη;

 

Ευχαριστώ. :-)

Δημοσ.
Όπως βλέπετε όσο ένα κουμπί είναι πατημένο (το "Α" συγκεκριμένα)

Αυτο δεν ισχυει.

Εαν ενα κουμπι ειναι πατιμενο, το event keydown δεν χτυπαει μια φορα.

Δημοσ.

Κανε αυτο και πες μου τι βλεπεις.

>    public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
           KeyPreview = true;
           this.KeyDown += (sender, e) =>
            {
                Text += "2";
            };
       }
    
   }

Δημοσ.
Μάλιστα. Αλλάζει ο τίτλος της φόρμας.

 

Εξήγησε μου που το πας. :P

 

Δεν μπενει ενα "2" στο τιτλο αλλα πολλλαααααααααααα οσο εχεις πατημενο το κουμπι

δοκιμαε αυτο και πες μου αν κανει αυτο που θελεις.

>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;
using System.Threading;
namespace WindowsFormsApplication2
{
   public partial class Form1 : Form
   {
       private void setTextCross(string text)
       {
           if (this.InvokeRequired)
               this.Invoke(new Action<string>(setTextCross), new object[] { text });
           else
               this.Text += text;
       }
       public Form1()
       {
           InitializeComponent();
           bool isKeyUp=true;
           Thread t = null;
           this.KeyDown += (sender, e) =>
               {
                   if (e.KeyCode == Keys.A && isKeyUp)
                   {
                       t = new Thread(() =>
                           {
                               while (t.IsAlive)
                               {
                                   Thread.Sleep(3000);
                                   setTextCross("s");
                               }
                           });
                       t.Start();
                       isKeyUp = false;
                   }
               };
           this.KeyUp += (sender, e) =>
               {
                   if (e.KeyCode == Keys.A)
                       isKeyUp = true;
                   if (t != null)
                       t.Abort();
               };
       }
    
   }
}

Δημοσ.

ναι μπαίνουν πολλά όσο το έχω πατημένο. Άμα θέλω delay πριν ξαναμπεί το επόμενο;

 

Ο κώδικας μου με mousedown / up πάνω σε κάποιο κουμπί πχ δουλεύει κανονικά.

Δημοσ.
ναι μπαίνουν πολλά όσο το έχω πατημένο. Άμα θέλω delay πριν ξαναμπεί το επόμενο;

 

Ο κώδικας μου με mousedown / up πάνω σε κάποιο κουμπί πχ δουλεύει κανονικά.

 

Παιζει να εχεις κανει καποιο λαθος. Δεν γινετε να αλλαξεις κατι χωρις να κανεις P/Invoke cross-thread .

Δημοσ.

Και όμως το status strip label το αλλάζει χωρίς να χρεαστεί invoke.

 

Μια περίληψη για το γιατί χρειάζεται η invoke πριν googlάρω για τα περαιτέρω; :-D

 

Ευχαριστώ για τη βοήθεια.

Δημοσ.
Και όμως το status strip label το αλλάζει χωρίς να χρεαστεί invoke.

Μια περίληψη για το γιατί χρειάζεται η invoke πριν googlάρω για τα περαιτέρω; :-D

 

Ευχαριστώ για τη βοήθεια.

 

nop Εαν το αλλαζε αλλο thread θα σου crashare το προγραμμα.

 

Για την περιληψη.. Οταν πας να παρεις ενα καφε θα περιμενεις πρωτα να παρει αυτος που ειναι μπροστα σου. Μια μνημη, πολλα νηματα, πρεπει να υπαρχει μια ταξη.

Δημοσ.

Θα συμφωνήσω με τον Evgenios1. Οτιδήποτε έχει σχέση με ανταπόκριση του συστήματος θα πρέπει να κάνεις invoke διαφορετικά θα έχεις exception με mscorlib.

 

Keydown event ενεργοποιήτε μόνο μία φορά. Αυτό που μπορεί να κάνεις είναι κάθε 5 δεύτερα να βλέπεις αν το key Α είναι πατημένο.

 

Επίσης θες άλλο event για το key up που θα σταματά το thread.

 

Για να μην κάνεις invoke θες Shared Public μεταβλητή να πέρνει την τιμή, η οποία θα επιτρέφει το text στο toolstriplabel το οποίο θα είναι και αυτό public shared. Αλλά αυτός είναι ο dirty τρόπος. Invoke για να έχεις το κεφάλι σου ήσυχο.

 

Βάλε και ένα try catch το οποίο θα σου στέλνει ένα email με το exception (ΌΧΙ message box γιατί θα κρασάρει το thread ως παραπάνω).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...