0

Методы по отдельности работают, но когда хочу выполнить их с помощь многопоточности ничего не происходит.

private void buttonFly_Click(object sender, EventArgs e)
        {
            Operator operator1 = new Operator(pictureBoxQuad1, pictureBoxMehan1, this.Width, this.Height);
            Operator operator2 = new Operator(pictureBoxQuad2, pictureBoxMeh2, this.Width, this.Height);
            Thread myThread1 = new Thread(operator1.StartFly);
            Thread myThread2 = new Thread(operator2.StartFly);
            myThread1.Start();
            myThread2.Start();
        }

public class Operator { System.Windows.Forms.Timer timer; Quadrocopter Quadrocopter; Mehanic1 Mehanic; PictureBox PictureBoxQuad; PictureBox PictureBoxMehan;

    public  Operator (PictureBox PictureBoxQuad, PictureBox PictureBoxMehan, int Width, int Height)
    {
        this.PictureBoxQuad = PictureBoxQuad;
        this.PictureBoxMehan = PictureBoxMehan;
        Quadrocopter = new Quadrocopter(Width, Height, PictureBoxQuad.Width, PictureBoxQuad.Height, PictureBoxQuad.Location); ;
        Mehanic = new Mehanic1();
        Quadrocopter.NotifyToFix += Mehanic.GoToFix;

        timer = new System.Windows.Forms.Timer();
        timer.Tick += MoveQuadrocopter;
    }

    public void StartFly()
    {
        timer.Start();
        Thread.Sleep(300);
    }

    void MoveQuadrocopter(Object sender, EventArgs e)
    {
        if (!Quadrocopter.IsQuadracFault)
        {
            timer.Interval = 100;
            PictureBoxQuad.Location = Quadrocopter.Execute();
        }
        else
        {
            timer.Interval = 1000;
            PictureBoxMehan.Location = Quadrocopter.Execute();
        }
    }
}

aepot
  • 49,560
Studene008
  • 41
  • 4
  • Удалось разобраться? – aepot Feb 12 '21 at 21:53
  • 1
    С данной проблемой нет . Не смотря на вашу помощь, все равно появлялись ошибки. Изменила саму логику программы, итоговая цель была достигнута. – Studene008 Feb 15 '21 at 14:05

1 Answers1

2

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

А вот так будет:

private void buttonFly_Click(object sender, EventArgs e)
{
    Operator operator1 = new Operator(pictureBoxQuad1, pictureBoxMehan1, this.Width, this.Height, this);
    Operator operator2 = new Operator(pictureBoxQuad2, pictureBoxMeh2, this.Width, this.Height, this);
    // ... ваш код
}
public class Operator
{
    // ...ваш код
    Form form;
public Operator (PictureBox PictureBoxQuad, PictureBox PictureBoxMehan, int Width, int Height, Form form)
{
    this.form = form;
    // ...
}

// ...
void MoveQuadrocopter(Object sender, EventArgs e)
{
    if (!Quadrocopter.IsQuadracFault)
    {
        timer.Interval = 100;
        Point location = Quadrocopter.Execute();
        form.Invoke((Action)(() => PictureBoxQuad.Location = location));
    }
    else
    {
        timer.Interval = 1000;
        Point location = Quadrocopter.Execute();
        form.Invoke((Action)(() => PictureBoxMehan.Location = location));     
    }
}

}

Form.Invoke() перенаправляет вызов в UI поток формы.

Еще я не уверен, будет ли System.Windows.Forms.Timer работать в многопоточной среде, если не будет, напишите, придумаем что-нибудь, есть и другие таймеры, и способы реализовать это без таймеров. Но чтобы понять, как правильно реализовать, надо выяснить, что там внутри у Quadrocopter.Execute().

aepot
  • 49,560
  • 1
    Эх, опять вы дубликаты не ищете... – EvgeniyZ Jan 07 '21 at 21:00
  • @EvgeniyZ окей, а по поводу таймера? Я не уверен, что будет работать, но протестировать не имею возможности, так что может дубликат, а может и не совсем. – aepot Jan 07 '21 at 21:11
  • @EvgeniyZ кстати в том ответе я бы таки заменил Task.Factory.StartNew на Task.Run. И LongRunning там - весьма спорное использование, хотя на суть async/await это не влияет. – aepot Jan 07 '21 at 21:17
  • Если это проблема таймеров (судя по документации данный таймер работает только в UI потоке, тут кстати можно почитать это), то тогда у вас изначально неверный ответ, акцент которого идет именно на решение проблемы из "вопроса закрывашки" (дубликата), с добавлением неуверенного "будет ли таймер работать в многопоточности". Вы тогда уж определитесь на что давать ответ, ибо в таком виде это чистый дубликат, а если вы распишете про таймер и в конце добавите просто ссылку на дубликат и простой пример, то тут согласен, ок, дубликатом не будет. – EvgeniyZ Jan 07 '21 at 21:54
  • По поводу "того ответа" - почему это адресовано мне? Ответ общий, любой может всегда его поправить/дополнить, дерзайте) – EvgeniyZ Jan 07 '21 at 21:54
  • @EvgeniyZ потому что вы его рефите. Не совсем логично, чтобы я шел править ваши референсы. – aepot Jan 08 '21 at 08:24
  • 2
    Вы сейчас это серьезно? По правилам ресурса мы что должны сделать? Правильно, если на вопрос уже есть ответ, то мы обязаны поставить голос за закрытие как "дубликат" и без разницы от кого там ответ, без разницы как он написан, главное, чтобы решал поставленную задачу. На SO есть вопросы/ответы, которые были созданы специально в целях закрытия других однотипных вопросов на них, и тот вопрос является одним из них. Я вообще не отношусь к тому вопросу как либо, я просто знаю, что он есть и всегда аналогичные вопросы буду закрывать им, таковы правила... Так что о каком "рефите" идет речь? – EvgeniyZ Jan 08 '21 at 09:33
  • @EvgeniyZ давайте не будем в "кто умнее задвинет речь о мировой справдливости" играть, я всё равно психану и переверну стол раньше. Я всего-лишь показал на то, что увидел. Давайте теперь дружно и сознательно на это забьем. Всё верно, правила же есть, можно не думать своей головой. – aepot Jan 08 '21 at 13:51
  • Просто не делайте меня виноватым, как вы всегда это любите. Я понимаю, что вы тут готовы нарушать все порядки, лишь бы заработать репутации, но я же не говорю вам "удаляйте этот ответ!", нет, наоборот, я даже сказал, как лучше бы его было поправить, чтоб он имел хоть какую-либо пользу для SO. Вот и все, я лишь этого хочу, чистоту и полезность ресурса, не более. А вы мне тут говорите "вы его рефите". Ваше право конечно думать, как угодно, но правила есть правила, следуйте им! А репутация, как я вам говорил ранее - давайте буду лайкать все ваши ответы, но оно вам надо? Берите лучше качеством! – EvgeniyZ Jan 08 '21 at 14:09
  • @EvgeniyZ я обязательно поправлю ответ, примерно сразу как получу фидбэк от автора вопроса, не хочу гадать. – aepot Jan 08 '21 at 14:12