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

Προβλημα με thread στη c#


GlobeXgr

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

Δημοσ.

Θέλω να φτιάξω ένα ένα 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'

Δημοσ.

>
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();
       }
   }
}

 

Δημοσ.

Η αλήθεια είναι πως στον 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();

Δημοσ.

_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

 

γιατι? ευχαριστω εκ των προτερων

Δημοσ.

Ειναι τοσο απλο. φτιαχνεις μια συναρτηση του τυπου 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();
       }
   }
}

Δημοσ.

Ευχαριστώ το εφτιαξα. Απλα στην 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 για αόριστο χρόνο??

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

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

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