2016-10-05 1 views
0

J'essaye d'envoyer un tableau dans un seul DoWork, mais dans ReportProgress, il n'y a aucun moyen de recevoir un tableau, je ne suis pas sûr de savoir ce que je devrais faire pour passer un tableau, vraiment apprécier si quelqu'un en a idée.Comment faire un rapportProgress multiples valeurs?

C'est ce que je voulais faire:

public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e) 
    { 
     do 
     { 
      X = -(RSSI_PI1_ST1); 
      Y = -(RSSI_PI1_ST1) + 5; 
      backgroundWorkerX.ReportProgress(X,Y); // pass X and Y 

      Thread.Sleep(50); 
     } while (true); 
    } 

Alors ici pour passer ces deux valeurs pour changer l'emplacement d'une image:

public void backgroundWorkerXY_ProgressChanged(object sender, object sender1, ProgressChangedEventArgs e) 
    { 
     pictureBox1.Location = new Point((int.Parse(e.ProgressPercentage.ToString())), (int.Parse(e.ProgressPercentage.ToString()))); 
    // Not sure how to let a single ProgressChanged to send two values here 
    } 

Il y a une autre façon de le faire est de les séparer, par exemple, passer X, et passer Y, mais pour changer un emplacement d'image, les valeurs doivent être un Point contient 2 valeurs (ce que j'ai découvert jusqu'à présent, peut ne pas être correct), donc je suppose doit être dans un seul ProgressChanged,

C'est ce que j'ai aussi essayé

pictureBox1.Location.X = new Point((int.Parse(e.ProgressPercentage.ToString()))); 

Cependant, il a dit « CS1612 Impossible de modifier la valeur de retour de « Control.Location » parce qu'il est pas une variable »

Ce que je suis en train de faire est pour changer l'emplacement pour X et Y, je suis vraiment la bienvenue à toutes les solutions alternatives, apprécie vraiment toutes les idées ou pensées!

+0

Y at-il une raison pour ne pas définir l'emplacement de l'image tout de suite? – Niklas

+0

@Niklas Probablement parce que l'appel de méthodes UI à partir d'un thread d'arrière-plan n'est pas autorisé. –

+0

ressemble à il essaie de réaliser une animation/déplacer les images à l'écran. –

Répondre

1

ReportProgress accepte comme second argument object. Vous pouvez l'utiliser pour renvoyer un type de données personnalisé ou simplement utiliser Tuple.

public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e) 
{ 
    do 
    { 
     X = -(RSSI_PI1_ST1); 
     Y = -(RSSI_PI1_ST1) + 5; 
     backgroundWorkerX.ReportProgress(50, new Tuple<int, int>(X,Y)); 

     Thread.Sleep(50); 
    } while (true); 
} 

UserState sera transmis à ProgressChanged args événement

public void backgroundWorkerXY_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    var args = (Tuple<int, int>)e.UserState; 
    pictureBox1.Location = new Point(args.Item1, args.Item2)); 
} 
+0

Salut, j'ai essayé mais obtenir "CS Aucune surcharge pour 'backgroundWorkerXY_ProgressChanged' correspond à un délégué 'ProgressChangedEventHandler' ", je pense que c'est à cause d'un nouvel" objet sender1 ", – tedhan

+0

Dans ma forme principale, j'ai écrit ceci: – tedhan

+0

backgroundWorkerXY.DoWork + = backgroundWorkerXY_DoWork; backgroundWorkerXY.ProgressChanged + = backgroundWorkerXY_ProgressChanged; backgroundWorkerXY.WorkerReportsProgress = true; backgroundWorkerXY.RunWorkerAsync(); – tedhan

1

Vous pouvez transmettre une classe personnalisée, par ex.

public class MyCustomClass 
{ 
    public int X {get;set;} 
    public int Y {get;set;} 
} 

Utilisez ensuite semblable à ceci:

public void backgroundWorkerXY_DoWork(object sender, DoWorkEventArgs e) 
{ 
    do 
    { 
     backgroundWorkerX.ReportProgress(
      0, 
      new MyCustomClass 
      { 
       X = -(RSSI_PI1_ST1), 
       Y = -(RSSI_PI1_ST1) + 5 
      }); 

     Thread.Sleep(50); 
    } while (true); 
} 

Et consommer comme:

public void backgroundWorkerXY_ProgressChanged(
    object sender, 
    ProgressChangedEventArgs e) 
{ 
    var my = (MyCustomClass)e.UserState; 

    pictureBox1.Location = new Point(my.X, my.Y); 
} 

Quelques références:

+0

J'ai effectivement trouvé cette méthode dans un autre message, mais je reçois une erreur disant "CS1503 \t Argument 1: ne peut pas convertir à partir de WindowsFormsApplication10. Form1.MyCustomClass 'à' int '", je pense que c'est parce que backgroundWorkerX.ReportProgress() peut seulement passer en entier, est-ce correct? – tedhan

+0

@tedhan Désolé, mauvaise signature, j'ai ajouté le '0, 'manquant dans mon code ci-dessus. –

+1

Pas besoin de désolé, j'apprécie vraiment beaucoup pour votre aide, j'ai réussi à le faire fonctionner, et merci beaucoup !!! – tedhan

2

le ReportProgress a une surcharge qui accepte un objet, vous pouvez l'utiliser.

worker.ReportProgress(someProgressPercentage, new Point(x,y)); 

private void backgroundWorkerXY_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    var point = (Point)e.UserState; 
    pictureBox1.Location = point; 
} 
+0

Merci! J'ai essayé la méthode de @Adnan Umer et ça marche !!! L'image bouge maintenant !!! MERCI!!! – tedhan