GlobeXgr Δημοσ. 22 Απριλίου 2011 Δημοσ. 22 Απριλίου 2011 Θέλω να φτιάξω ένα ένα thread στη c# που να τρέχει μια συνάρτηση με παραμέτρους, κάπως έτσι: >Thread th = new Thread(alg(x, y)); Όμως από οτι καταλαβαίνω από τα errrors που μου βγάζει και μια google αναζητηση δεν επιτρεεπεται να έχεις threads με παραμέτρους. Πως μπορώ λοιπόν να το κάνω αυτο. Errors: - Error 1 The best overloaded method match for 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' has some invalid arguments - Error 2 Argument 1: cannot convert from 'void' to 'System.Threading.ParameterizedThreadStart'
παπι Δημοσ. 22 Απριλίου 2011 Δημοσ. 22 Απριλίου 2011 > namespace ConsoleApplication1 { class Program { public static void worker(object obj) { foreach (int v in obj as Array) { Console.WriteLine(v); } } static void Main(string[] args) { System.Threading.Thread th = new System.Threading.Thread(worker); th.Start(new int[]{1,2,3,4,5,6,7,8}); Console.Read(); } } }
_tasos Δημοσ. 22 Απριλίου 2011 Δημοσ. 22 Απριλίου 2011 Η αλήθεια είναι πως στον constructor του Thread δεν μπορείς να βάλεις όνομα συνάρτησης με ορίσματα. Αυτό που μπορείς να κάνεις για να περάσεις ορίσματα στη συνάρτηση που θα εκτελεστεί μέσα από κάποιο νήμα είναι να βάλεις τις τιμές που θέλεις να περάσεις π.χ. σε global μεταβλητές. Το να χρησιμοποιείς global μεταβλητές για αυτή τη δουλειά δεν είναι καλή ιδέα, οπότε θα πρότεινα να φτιάξεις μία κλάση η οποία θα έχει για properties τις παραμέτρους που θέλεις και ένα thread. Για παράδειγμα: > public class mythread { private int InnerX, InnerY; public Thread InnerThread; void mythread(int x, int y) { InnerX = x; InnerY = y; InnerThread = new Thread(dostuff); } void dostuff() { alg(InnerX, InnerY); } private void alg(int x, int y) { //actual code execution } } και τρέχεις το thread σου έτσι: > threadtorun = new mythread(3, 4); //set yor parameters here threadtorun.InnerThread.Start();
GlobeXgr Δημοσ. 22 Απριλίου 2011 Μέλος Δημοσ. 22 Απριλίου 2011 _tasos tx & παπι για την απαντηση Εχω την κλάση: >public class mythread { private S InnerX, InnerY; public Thread InnerThread; void mythread(S x, S y) { InnerX = x; InnerY = y; InnerThread = new Thread(dostuff); } void dostuff() { algorithm(InnerX, InnerY); } private void algorithm(S i, S f) { //staff done here } } To S ειναι μια αλλη κλαση. Απο την βασικη κλάση του προγραμματος μου και συγκεκριμενα απο τη main εκτελώ το παρακάτω: >mythread threadtorun = new mythread(i, f); threadtorun.InnerThread.Start(); και πέρνω λάθος Error 1 'BidirectionalBFS.mythread' does not contain a constructor that takes 2 arguments γιατι? ευχαριστω εκ των προτερων
παπι Δημοσ. 22 Απριλίου 2011 Δημοσ. 22 Απριλίου 2011 Ειναι τοσο απλο. φτιαχνεις μια συναρτηση του τυπου ParameterizedThreadStart >public void myTheardProc(object obj) { } Φτιαχνεις ενα object τυπου Thread με constr που παιρνει ParameterizedThreadStart > Thread mtThread = new Thread(myThreadProc); καλεις την συναρτηση Start του thread object με ενα array απο object (που και αυτο ειναι ενα object) με αυτα που θελεις να περασεις (τα οποια θα τα εχεις lockarei) >myThread.Start(new object[]{x,y}) Δες αυτο > namespace ConsoleApplication1 { class MyClass { public int Value { get;set;} public void SetValue() { System.Threading.Thread.Sleep(1000);//working Value = (new Random()).Next(); } public void Print() { Console.WriteLine(Value); } } class MyApp { MyClass m1, m2; event Action workdone_handler; public MyApp() { m1 = new MyClass(); m2 = new MyClass(); workdone_handler += new Action(workDone); } void worker(object obj) { //το object ειναι ενα array foreach (MyClass v in (obj as IEnumerable<object>).Where(x=>x is MyClass)) // παιρνουμε μονο τα myclass και κανουμε κατι { v.SetValue(); } ((obj as IEnumerable<object>).Where(x => x is Action).Single() as Action)(); // καλουμε το event οτι τελειωσε } void workDone() { //θα χτυπησει οταν τελειωσει το... myclass.setvalue Console.WriteLine(m1.Value+" "+m2.Value); } public void Run() { lock (this) { System.Threading.Thread th = new System.Threading.Thread(worker); th.Start(new object[] { m1, m2 , workdone_handler});// παιρνα απο το object το m1,m2 και ενα event handler για να ξερουμε ποτε θα τελειωσει } } } class Program { static void Main(string[] args) { MyApp my = new MyApp(); my.Run(); Console.Read(); } } }
GlobeXgr Δημοσ. 22 Απριλίου 2011 Μέλος Δημοσ. 22 Απριλίου 2011 Ευχαριστώ το εφτιαξα. Απλα στην constructor του thread την εκανα public και εβγαλα το void. Δε ξερω γιατι, αλλα εφτιαξε. Ευχαριστώ για τις απαντησεις και παλι. Τωρα αντιμετοπίζω αλλο πρόβλημα. Εχω δυο threads οπως αυτα που περιγραψαμε πανω. Η συναρτηση algorithm(InnerX, InnerY) τρέχει σε επαναλήψεις. Σε κάθε επανάληψη θέλω να σταματάει το thread και να καλείται μια συνάρτηση η οποία θα πέρνει σαν ορισμα μια μεταβλητή από την κάθε συνάρτηση που τρέχει το thread. Καμία ιδεα??? σόρρυ αν σας μπέρδεψα. Σε μουφοκώδικα θέλω κατι τέτοιο. algorithm(InnerX, InnerY) { //do stuff check(); <----??? } void check(thread1.x, thread2.x) { //do stuff } Αλλα πώς θα γίνει να καλείτε μια φορά στο τέλος κάθε επανάληψης σταματώντας και τα δύο threads σε εκείνο το σημείο. Επίσης πως σταματάω ενα thread για αόριστο χρόνο??
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.