mojiro Δημοσ. 15 Σεπτεμβρίου 2009 Δημοσ. 15 Σεπτεμβρίου 2009 Πρόσφατα ασχολήθηκα λίγο παραπάνω με το multi-threading μέσω από ένα project που δημιουργώ, και μπορώ να πω ότι συνάντησα πολλά προβλήματα. Επομένως προκειμένου να πειραματιστώ χωρίς καταστρέψω το project μου, έφτιαξα ένα μικρό project με μερικούς συνδυασμούς εκτέλεσης subs/functions που συναντούνται ως πρόβλημα. Και ενώ όλα ξεκινάνε κάπως έτσι ... >myThread = New System.Threading.Thread(AddressOf myThreadySubNoParam) Call myThread.Start() ... συνήθως καταλήγουν κάπως απότομα στο ... >Cross-thread operation not valid: Control 'myTextBox' accessed from a thread other than the thread it was created on. και αυτό σημαίνει ότι το νέο μας thread προσπάθησε να αποκτήσει πρόσβαση στο αντικείμενο myTextBox που δημιουργήθηκε από άλλο thread (συνήθως αυτό που άνοιξε και τη φόρμα). Για να αντιμετωπιστούν τέτοια προβλήματα έχουν υλοποιηθεί μερικές λειτουργίες στα αντικείμενα που περιέχουν τη λέξη κλειδί "Invoke". Προσπαθώντας να καταλάβω πως λειτουργούν, έχω συμπεράνει ότι επειδή το αντικείμενο που θέλουμε, δε μπορεί να μας δώσει τώρα αμέσως πρόσβαση, θα πρέπει να κάνουμε ένα work-around και να του δώσουμε να εκτελέσει ένα sub ή μία function (με ή χωρίς παραμέτρους) όταν αυτό είναι ελεύθερο (προσωρινά) από το πρώτο thread. Περισσότερα δε μπορώ να πω γιατί ακόμη ψάχνω να βρω άκρη και δεν έχω τίποτα με ασφάλεια τεκμηριωμένο. Η αλήθεια είναι ότι έχω βρει πάρα πολύ υλικό για C# και ελάχιστο για Visual Basic .net . Δεδομένου ότι η σύνταξη της Visual Basic έχει περιορισμούς κάνει τα πράγματα πιο δύσκολα. Στο project που είναι επισημασμένο θα βρείτε μία φόρμα, όπου σας δίδεται η δυνατότητα να εκτελέσετε ένα sub ή μία function (με ή χωρίς παραμέτρους) τα αποτελέσματα των οποίων εμφανίζονται είτε στο myTextBox (αντικείμενο προς διένεξη) είτε στο παραθυράκι Immediate του IDE. Λέξεις κλειδιά Invoke BeginInvoke MethodInvoker Delegate Lamda Expressions Thread Αναφορές http://www.codeproject.com/KB/cs/Cross_thread_Events.aspx http://www.codeproject.com/KB/cs/AvoidingInvokeRequired.aspx http://www.codeproject.com/KB/vb/Delegate.aspx http://www.vbforums.com/showthread.php?t=444579 TheDelegator.zip
Evgenios1 Δημοσ. 15 Σεπτεμβρίου 2009 Δημοσ. 15 Σεπτεμβρίου 2009 Αυτο που λες ειναι μονο για WinForm και τιποτα αλλο.
mojiro Δημοσ. 15 Σεπτεμβρίου 2009 Μέλος Δημοσ. 15 Σεπτεμβρίου 2009 Αυτό που λες είναι μόνο για WinForm και τίποτα άλλο. εννοείς ότι το πρόβλημα εμφανίζεται μόνο με τα controls; ενώ με τα λοιπά objects όχι;
Evgenios1 Δημοσ. 15 Σεπτεμβρίου 2009 Δημοσ. 15 Σεπτεμβρίου 2009 Δεν ειναι προβλημα. τσεκαρε το παρακατω >[color="#0000ff"][b]using[/b][/color] System; [color="#0000ff"][b]using[/b][/color] System.Threading; [color="#0000ff"][b]namespace[/b][/color] prj_211 { [color="#0000ff"][b]class[/b][/color] Program { [color="#0000ff"][b]static[/b][/color] [color="#0000ff"][b]void[/b][/color] Main([color="#8000ff"]string[/color][] args) { [color="#2b91af"]ThreadStart[/color] t1 = [color="#0000ff"][b]delegate[/b][/color] { [color="#2b91af"]Console[/color].WriteLine([color="#2b91af"]Thread[/color].CurrentThread.ManagedThreadId); obj = [color="#a31515"]"time"[/color]; [color="#2b91af"]Console[/color].WriteLine([color="#a31515"]"Excuted!"[/color]); }; [color="#2b91af"]Thread[/color] thr = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]Thread[/color](t1); thr.Start(); [color="#2b91af"]Console[/color].Read(); } [color="#0000ff"][b]static[/b][/color] [color="#8000ff"]object[/color] obj { [color="#0000ff"][b]set[/b][/color] { [color="#2b91af"]Console[/color].WriteLine(([color="#8000ff"]string[/color])value); } } } } Υγ: Εχω μια απορια, τι εφτιαξες που σου κολλησε το thread?
mojiro Δημοσ. 19 Σεπτεμβρίου 2009 Μέλος Δημοσ. 19 Σεπτεμβρίου 2009 Υγ: Έχω μια απορία, τι έφτιαξες που σου κόλλησε το thread? https://sourceforge.net/projects/dotkernel/
Evgenios1 Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 Με τι το εχεις ziparei??? btw νομιζω οτι ενα προγρμμα σε net, εχει απο μονο του(default) 25 threads Ψαξου λιγο για asynchronous methods .net , και αμα σκαλωσει καπου, μη ξεχνας οτι η .net ειναι WINAPI.
dt008 Δημοσ. 22 Σεπτεμβρίου 2009 Δημοσ. 22 Σεπτεμβρίου 2009 Με τι το εχεις ziparei??? btw νομιζω οτι ενα προγρμμα σε net, εχει απο μονο του(default) 25 threads Ψαξου λιγο για asynchronous methods .net , και αμα σκαλωσει καπου, μη ξεχνας οτι η .net ειναι WINAPI. Δεν έχει κάθε πρόγραμμα 25 threads, αλλά κάθε πρόγραμμα έχει access στη ThreadPool του Framework, η οποία έχει default ανοιχτά ένα νούμερο από threads (κάπου κοντά στο 25, αλλά δεν θυμάμαι ακριβώς) σε κατάσταση sleeping, και τα 'ξυπνάει' on demand. Επίσης, κάποια πράγματα του .ΝΕΤ είναι wrappers για το Win32 API, αλλά προφανώς όχι και όλο το .ΝΕΤ
djsolid Δημοσ. 22 Σεπτεμβρίου 2009 Δημοσ. 22 Σεπτεμβρίου 2009 Δεν έχει κάθε πρόγραμμα 25 threads, αλλά κάθε πρόγραμμα έχει access στη ThreadPool του Framework, η οποία έχει default ανοιχτά ένα νούμερο από threads (κάπου κοντά στο 25, αλλά δεν θυμάμαι ακριβώς) σε κατάσταση sleeping, και τα 'ξυπνάει' on demand.Επίσης, κάποια πράγματα του .ΝΕΤ είναι wrappers για το Win32 API, αλλά προφανώς όχι και όλο το .ΝΕΤ Και συνεχίζοντας αυτό που λέει ο dt008 είναι καλύτερο να χρησιμοποιούμε το ThreadPool.QueueUserWorkItem από το Thread.Start()
mojiro Δημοσ. 22 Σεπτεμβρίου 2009 Μέλος Δημοσ. 22 Σεπτεμβρίου 2009 Thanks για τις παρατηρήσεις, θα προσπαθήσω να προσθέσω υποστήριξη για ν-? threads. Γενικότερα ότι νομίζετε ότι πρέπει να έχει ένας kernel-άκος, ας μου το προτείνετε. Με τη δική μου εμπειρία και ανάγκες βάζω μόνο αυτά που χρειάζομαι. Σχετικά με το .zip το ανέβασα ξανά και νομίζω πως αποσυμπιέζεται πλέον.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.