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

[Tutorial-VB.net] a Thready project


mojiro

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

Δημοσ.

Πρόσφατα ασχολήθηκα λίγο παραπάνω με το 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

post-17879-12906302416_thumb.png

TheDelegator.zip

Δημοσ.
Αυτό που λες είναι μόνο για WinForm και τίποτα άλλο.

 

εννοείς ότι το πρόβλημα εμφανίζεται μόνο με τα controls; ενώ με τα λοιπά objects όχι;

Δημοσ.

Δεν ειναι προβλημα.

τσεκαρε το παρακατω

 

>[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?

Δημοσ.

Με τι το εχεις ziparei??? btw νομιζω οτι ενα προγρμμα σε net, εχει απο μονο του(default) 25 threads ;) Ψαξου λιγο για asynchronous methods .net , και αμα σκαλωσει καπου, μη ξεχνας οτι η .net ειναι WINAPI.

Δημοσ.
Με τι το εχεις 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, αλλά προφανώς όχι και όλο το .ΝΕΤ :-)

Δημοσ.
Δεν έχει κάθε πρόγραμμα 25 threads, αλλά κάθε πρόγραμμα έχει access στη ThreadPool του Framework, η οποία έχει default ανοιχτά ένα νούμερο από threads (κάπου κοντά στο 25, αλλά δεν θυμάμαι ακριβώς) σε κατάσταση sleeping, και τα 'ξυπνάει' on demand.

Επίσης, κάποια πράγματα του .ΝΕΤ είναι wrappers για το Win32 API, αλλά προφανώς όχι και όλο το .ΝΕΤ :-)

 

Και συνεχίζοντας αυτό που λέει ο dt008 είναι καλύτερο να χρησιμοποιούμε το ThreadPool.QueueUserWorkItem από το Thread.Start()

Δημοσ.

Thanks για τις παρατηρήσεις, θα προσπαθήσω να προσθέσω υποστήριξη για ν-? threads.

 

Γενικότερα ότι νομίζετε ότι πρέπει να έχει ένας kernel-άκος, ας μου το προτείνετε. Με τη δική μου εμπειρία και ανάγκες βάζω μόνο αυτά που χρειάζομαι.

 

Σχετικά με το .zip το ανέβασα ξανά και νομίζω πως αποσυμπιέζεται πλέον.

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

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

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