Haros Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 Καλησπέρα, έχω τον ακόλουθο κώδικα σε 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(). Καμία άποψη; Ευχαριστώ.
Evgenios1 Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 Όπως βλέπετε όσο ένα κουμπί είναι πατημένο (το "Α" συγκεκριμένα) Αυτο δεν ισχυει. Εαν ενα κουμπι ειναι πατιμενο, το event keydown δεν χτυπαει μια φορα.
Haros Δημοσ. 19 Ιουλίου 2010 Μέλος Δημοσ. 19 Ιουλίου 2010 Γιατί δεν ισχύει; Έχω στην φόρμα KeyPreview= True.
Evgenios1 Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 Κανε αυτο και πες μου τι βλεπεις. > public partial class Form1 : Form { public Form1() { InitializeComponent(); KeyPreview = true; this.KeyDown += (sender, e) => { Text += "2"; }; } }
Haros Δημοσ. 19 Ιουλίου 2010 Μέλος Δημοσ. 19 Ιουλίου 2010 Μάλιστα. Αλλάζει ο τίτλος της φόρμας. Εξήγησε μου που το πας.
Evgenios1 Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 Μάλιστα. Αλλάζει ο τίτλος της φόρμας. Εξήγησε μου που το πας. Δεν μπενει ενα "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(); }; } } }
Haros Δημοσ. 19 Ιουλίου 2010 Μέλος Δημοσ. 19 Ιουλίου 2010 ναι μπαίνουν πολλά όσο το έχω πατημένο. Άμα θέλω delay πριν ξαναμπεί το επόμενο; Ο κώδικας μου με mousedown / up πάνω σε κάποιο κουμπί πχ δουλεύει κανονικά.
Evgenios1 Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 ναι μπαίνουν πολλά όσο το έχω πατημένο. Άμα θέλω delay πριν ξαναμπεί το επόμενο; Ο κώδικας μου με mousedown / up πάνω σε κάποιο κουμπί πχ δουλεύει κανονικά. Παιζει να εχεις κανει καποιο λαθος. Δεν γινετε να αλλαξεις κατι χωρις να κανεις P/Invoke cross-thread .
Haros Δημοσ. 19 Ιουλίου 2010 Μέλος Δημοσ. 19 Ιουλίου 2010 Και όμως το status strip label το αλλάζει χωρίς να χρεαστεί invoke. Μια περίληψη για το γιατί χρειάζεται η invoke πριν googlάρω για τα περαιτέρω; Ευχαριστώ για τη βοήθεια.
Evgenios1 Δημοσ. 19 Ιουλίου 2010 Δημοσ. 19 Ιουλίου 2010 Και όμως το status strip label το αλλάζει χωρίς να χρεαστεί invoke.Μια περίληψη για το γιατί χρειάζεται η invoke πριν googlάρω για τα περαιτέρω; Ευχαριστώ για τη βοήθεια. nop Εαν το αλλαζε αλλο thread θα σου crashare το προγραμμα. Για την περιληψη.. Οταν πας να παρεις ενα καφε θα περιμενεις πρωτα να παρει αυτος που ειναι μπροστα σου. Μια μνημη, πολλα νηματα, πρεπει να υπαρχει μια ταξη.
Apoll Δημοσ. 22 Ιουλίου 2010 Δημοσ. 22 Ιουλίου 2010 Θα συμφωνήσω με τον 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 ως παραπάνω).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.