MarcusCole6833 Ответов: 3

Получение программы для приостановки a в цикле на определенный период времени для выполнения некоторых действий


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

У меня есть свой список упражнений и xml-файл, как таковой.

<routine>
    <exercise>
        <order>1</order>
        <name>Row Close</name>
        <time>30</time>
    </exercise>
    <exercise>
        <order>2</order>
        <name>Arm Row Right</name>
        <time>30</time>
    </exercise>



Из этого я создаю структуру

struct workout
   {
       private string _name;
       private int _time;
       private bool _complete;
       private int _id;



       public string Name { get => _name; set => _name = value; }
       public int Time { get => _time; set => _time = value; }
       public bool Complete { get => _complete; set => _complete = value; }
       public int Id { get => _id; set => _id = value; }
   }


Эта структура имеет список его, как я повторяю упражнение.

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

указано в структуре.

Я зацикливаюсь на списке и хочу сделать это на каждом объекте в упражнении пустота списка

private void Exercise(workout w)
        {
            lbActivity.Text = w.Name;
            lbTime.Text = w.Time.ToString();
            string v = "\\";
            string iFileLoc = Properties.Settings.Default.ExercisePics.ToString() + v + w.Name + ".jpg";
            pBxExercise.ImageLocation = iFileLoc;
            pBxExercise.SizeMode = PictureBoxSizeMode.AutoSize;
            //Thread.Sleep(3000);
            // setting A forms timer to Start.
        }


Что я уже пробовал:

чтобы заставить его сделать паузу я попробовал следующее

My issue is htta the loop never change the picture, when I want it to.

The tread sleep pause it and the timer runs after the loop.

I just need some guidance, as I have not worked with task or threading before any help is appreciated.

Maciej Los

Вы пробовали установить источник изображения для pBxExcercise?

MarcusCole6833

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

pBxExercise.ImageLocation = iFileLoc;

Приведенный выше код не распространяется на источник изображения hte, так как я не нашел свойства источника изображения?

MarcusCole6833

спасибо

MarcusCole6833

спасибо

MarcusCole6833

я буду работать с вашими изменениями сегодня вечером, спасибо Вам, Дамы и господа!

3 Ответов

Рейтинг:
25

Richard Deeming

Thread.Sleep блокирует текущий поток на заданное время.

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

Вместо этого используйте таймер:
Класс Таймера (System.Окна.Формы) | Microsoft Docs[^]


MarcusCole6833

спасибо

Рейтинг:
14

F-ES Sitecore

Используйте тренировочный класс

public class Workout
{
    public string Name { get; set; }
    public int Time { get; set; }
    public bool Complete { get; set; }
    public int Id { get; set; }
}


В моем примере я использую простую метку (lblWorkoutName), чтобы показать текущую тренировку, вы можете сохранить свою коробку с картинками. Затем добавьте таймер в форму (я оставил свой под названием "timer1", но вы должны дать ему разумное имя). Затем таймер используется для запуска, когда должна быть показана следующая тренировка.

public partial class Form1 : Form
{
    private List<Workout> workouts;
    private int currentWorkout;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // I'm hard-coding the data, yours will come from the xml
        workouts = new List<Workout>
        {
            new Workout {Id = 1, Name = "Row Close", Time = 3},
            new Workout {Id = 2, Name = "Arm Row Right", Time = 5}
        };

        currentWorkout = 1;

        ShowWorkout(currentWorkout);
    }

    private void ShowWorkout(int id)
    {
        timer1.Stop();

        Workout workout = workouts.SingleOrDefault(w => w.Id == id);

        if (workout == null)
        {
            lblWorkoutName.Text = "Workout over";
            return;
        }

        lblWorkoutName.Text = workout.Name;

        timer1.Interval = workout.Time * 1000;
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        currentWorkout++;
        ShowWorkout(currentWorkout);
    }
}


MarcusCole6833

спасибо

Рейтинг:
12

Maciej Los

Я предполагаю, что вы не видите изображения...

Исходя из этого: c# - Как загрузить изображение в PictureBox; на основе местоположения изображения, хранящегося в базе данных - переполнение стека[^]

Цитата:
MSDN не совсем ясна в этом вопросе - ImageLocation свойство, но кажется, что установка ImageLocation собственность возможно, вы не совсем загружаете изображение, так что вы можете попробовать использовать PictureBox.Метод Загрузки (System.Окна.Формы) | Microsoft Docs[^] вместо:


MarcusCole6833

спасибо

Maciej Los

Всегда пожалуйста.