2016-10-05 3 views
0

Я пытаюсь отправить массив в одну DoWork, но в ReportProgress нет способа получить массив, я не уверен, что мне делать, чтобы передать массив, действительно оцените, есть ли у кого-либо идея.Как ReportProgress несколько значений?

Это то, что я пытаюсь сделать:

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

Тогда здесь, чтобы передать эти два значения, чтобы изменить расположение образа:

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 
    } 

Существует альтернативный способ сделать это состоит в том, чтобы отделить их, например, передать X и передать Y, но для изменения местоположения изображения значения должны быть Точкой, содержащей 2 значения (то, что я обнаружил до сих пор, может быть неверным), поэтому я принимаю это должен быть в одном ProgressChanged,

Это то, что я пытался

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

Однако сказал «CS1612 Невозможно изменить возвращаемое значение„Control.Location“, потому что это не переменная»

То, что я пытаюсь сделать, это чтобы изменить местоположение для X и Y, я действительно приветствую любые альтернативные решения, действительно ценю любые идеи или мысли!

+0

Есть ли причина не устанавливать местоположение изображения сразу? – Niklas

+0

@Niklas Вероятно, потому что вызов методов пользовательского интерфейса из фонового потока недопустим. –

+0

похоже, что он пытается добиться некоторой анимации/перемещения изображений на экране. –

ответ

1

ReportProgress принимает второй аргумент как object. Вы можете использовать это, чтобы либо вернуть пользовательский тип данных, либо просто использовать 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 будет передан ProgressChanged аргументов событий

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

Привет, я пробовал это, но получаю «CS Перегрузка для делегата« backgroundWorkerXY_ProgressChanged » «ProgressChangedEventHandler», я думаю, что это из-за нового «объекта sender1», – tedhan

+0

В моей основной форме я написал следующее: – tedhan

+0

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

1

Вы можете передать пользовательский класс, например, например.

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

Затем используйте его похожим на это:

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

И потребляют нравится:

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

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

Некоторые ссылки:

+0

Я действительно нашел этот метод в другом посте, но я получаю сообщение об ошибке «CS1503 \t Аргумент 1: невозможно преобразовать из« WindowsFormsApplication10 ». Form1.MyCustomClass 'to' int '", я думаю, это потому, что backgroundWorkerX.ReportProgress() может передавать только целое число, это правильно? – tedhan

+0

@tedhan Извините, неверная подпись, я добавил отсутствующий «0» в моем коде выше. –

+1

Не нужно жалеть, я очень ценю вашу помощь, я успешно ее работаю, и спасибо большое! – tedhan

2

ReportProgress имеет перегрузку, которая принимает любой объект, вы можете использовать.

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

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

Спасибо !!! Я попробовал метод @Adnan Umer, и он работает !!! Изображение движется прямо сейчас! БЛАГОДАРЯ!!! – tedhan

Смежные вопросы