2016-10-05 8 views
0

Ich versuche, ein Array in einem einzigen DoWork zu senden, aber in ReportProgress, gibt es keine Möglichkeit, ein Array zu erhalten, ich bin mir nicht sicher, was ich tun soll, um ein Array übergeben zu können, wirklich zu schätzen, wenn jemand hat Idee.Wie ReportProgress mehrere Werte?

Das ist, was ich versuche zu tun: hier

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

Dann diese beiden Werte zu übergeben Sie die Stellen eines Bildes zu ändern:

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 
    } 

eine alternative Art und Weise ist, es zu tun ist es, sie zu trennen, zum Beispiel, übergeben X, und übergeben Sie Y, aber um eine Position des Bildes zu ändern, müssen die Werte ein Punkt enthält 2 Werte (was ich bis jetzt entdeckt, kann nicht korrekt sein), also nehme ich an muss in einem einzigen ProgressChanged sein,

Das habe ich auch versucht,

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

jedoch gesagt „CS1612 kann den Rückgabewert von‚Control.Location‘nicht geändert werden, da es keine Variable ist“

Was ich zu tun versuchen, ist Um den Ort für X und Y zu ändern, bin ich herzlich willkommen auf alternative Lösungen, wirklich schätzen alle Ideen oder Gedanken!

+0

Gibt es einen Grund, den Speicherort des Bildes nicht sofort festzulegen? – Niklas

+0

@ Niklas Wahrscheinlich, weil das Aufrufen von UI-Methoden aus einem Hintergrundthread nicht zulässig ist. –

+0

sieht aus wie er versucht, etwas Animation zu erreichen/die Bilder auf dem Bildschirm zu bewegen. –

Antwort

1

ReportProgress akzeptiert zweites Argument als object. Sie können das verwenden, um entweder einen benutzerdefinierten Datentyp zurückzugeben oder einfach Tuple zu verwenden.

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 wird ProgressChanged Veranstaltung args

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

Hallo, habe ich versucht, aber bekommen "CS Keine Überladung für 'backgroundWorkerXY_ProgressChanged' entspricht Delegat 'ProgressChangedEventHandler' ", ich denke es liegt an einem neuen" object sender1 ", – tedhan

+0

In meinem Hauptformular habe ich folgendes geschrieben: – tedhan

+0

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

1

Sie könnten eine benutzerdefinierte Klasse wie z.

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

Dann verwenden Sie es wie folgt aus:

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

Und verbrauchen sie mag:

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

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

Einige Referenzen:

+0

Ich habe diese Methode in einem anderen Post gefunden, aber ich bekomme eine Fehlermeldung "CS1503 \t Argument 1: kann nicht von 'WindowsFormsApplication10 konvertieren. Form1.MyCustomClass 'zu' int '", ich denke es ist, weil backgroundWorkerX.ReportProgress() nur Integer übergeben kann, ist das korrekt? – tedhan

+0

@tedhan Sorry, falsche Signatur, ich habe die fehlende '0,' in meinem obigen Code hinzugefügt. –

+1

Kein Grund zur Entschuldigung, ich schätze wirklich viel für Ihre Hilfe, ich habe es erfolgreich geschafft, und vielen Dank !!! – tedhan

2

die ReportProgress hat geben werden, um eine Überlastung, die jedes Objekt akzeptiert, können Sie diese verwenden.

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

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

Danke !!! Ich habe @Adnan Umers Methode ausprobiert und es funktioniert !!! Das Bild bewegt sich gerade jetzt !!! VIELEN DANK!!! – tedhan