2015-06-24 3 views
0

У меня есть класс под названием Movement, который перемещает окно изображения (парень слева) в моей форме в случайную позицию, когда запускается метод Lead. У меня также есть метод, который перемещает другое окно изображения (темный парень справа), называемый SetMrShadowToMove. Предполагается, что эти два блока изображений будут перемещаться в одно и то же время и одновременно достигать случайной точки (одна точка для обоих блоков изображений).Простая многопоточная проблема

enter image description here

В настоящем время, эти методы использовать таймер для перемещения ящиков изображения, но мое главное намерение состояло в том, чтобы иметь цикл, который работает до тех пор, координаты Изображения коробки в не соответствуют случайной точке определена при использовании Thread.Sleep в задержать процесс и сделать анимацию.

Для этого мне нужно запустить оба метода в разных потоках, поэтому мой поток пользовательского интерфейса не замерзнет, ​​и эти методы будут выполняться в одно и то же время.

Моя проблема в том, что я не знаю, как использовать эти методы для разных потоков, а также не знаю, как получить доступ к окнам с картинками на других потоках (кажется, что это имеет какое-то отношение к вызовам и материал!).

Каков наилучший способ решить эту проблему?

+1

Лучший способ не использовать winforms для создания игр – dotctor

+0

Это не игра, а просто практическая анимация, чтобы узнать многопоточность и некоторые другие вещи. –

+0

http://www.codeproject.com/Articles/18702/Threading-in-NET-and-WinForms – dotctor

ответ

1

Лучший способ (на мой взгляд) использовать фоновый рабочий.

Эти вещи могут делать там вычисления в фоновом режиме. Если вы хотите обновить интерфейс после этого, вы можете использовать там отчет о ходе выполнения, чтобы вызвать ваш основной (интерфейс) поток и перерисовать экран. Вы также можете завершить работу, даже если вы хотите, чтобы событие фонового работника было окончательным даже (например, если «тень мистера» «уничтожена» или что-то еще).

Я не знаю вашего кода тени господина, поэтому у меня нет прямого кода примера для вас. Но полный пример о том, как использовать фонового работника, можно найти в msdn here. Я надеюсь, что это поможет вам.

+0

Ну, на самом деле главная цель здесь - создать ходячую анимацию. Вот почему мне нужно обновить основной поток при каждом выполнении моего цикла. Рассмотрим цикл while, который выполняется до тех пор, пока X и Y не равны RndX и RndY. При каждом запуске цикла значение X или Левое значение блока изображения и значение Y или Верхнее значение увеличивается или уменьшается на основе RndX и RndY. Здесь важно обновить интерфейс после каждого перемещения окна изображения. –

+0

что решает, перемещается ли поле изображения? Является ли это объектом самого окна изображения, которое должно работать в фоновом режиме? Если это так, вы можете создать цикл в событии dowork. В этом цикле вы вычисляете, куда должен быть поле для изображения, и какое изображение должно отображаться для анимации. Эта информация вы отправляете на событие прогресса отчета, и у вас есть одно обновление вашего графического интерфейса. Если вы сделаете сон на итерации недолговечным, это может быть довольно гладко (имейте в виду, что вы никогда не получаете полной гладкой анимации в формах, вам нужны разные вещи, а затем окна с картинками и окна. –

+0

начните перемещаться в одно и то же время на Form_Load, и они будут продолжать двигаться, пока приложение не будет завершено пользователем. Если я использую событие DoWork для фона BackgroundWorker, и я использую Thread.Sleep в цикле внутри DoWork (цикл, который я обсуждал в предыдущем комментарии), как мне получить доступ к экранам изображений или изменить их картинку? И помимо решения backgroundworker, как бы я мог добиться того же, используя простые потоки, запущенные одновременно? Если вам интересно, я могу показать вам весь код (это не так много) для уточнения. –

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