Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Анимация картинок работает только в потоке / 25 сообщений из 42, страница 1 из 2
25.04.2018, 15:12
    #39636088
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Метод Animation работает только в отдельном потоке, почему?

Объясните, почему не работает в этом коде анимация картинок(теория)

Наверное через таймер работать будет, но я спрашиваю именно почему так не работает

Вот код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace AnimaciyaIsKartinok
{
    public partial class MainForm : Form
    {
        public List<Image> ImageList = new List<Image>();
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            LoadTexture();
            Animation();
        }

        void Animation()
        {
            for (int index = 0; index >= 0; index++)
            {

                if (index > 7)
                    index = 0;
                ScreenImage.Image = this.ImageList[index];

            }
        }
        void LoadTexture()
        {
            try
            {

                for (int index = 0; index < 8; ++index)
                {
                    ImageList.Add(Image.FromFile("./Image/Image" + (object) index + ".bmp"));

                }
            }
            catch
            {
                int num = (int) MessageBox.Show("Нету одного из файлов изображения.");
                this.Close();
            }
        }
    }
}



Модератор: Учимся использовать тэги оформления кода - FAQ

Кода с методом Animation в потоке, нет, но он работает в потоке, пожалуйста не придирайтесь

Очень жду ответа, пожалуйста поподробнее и без флуда и оскорблений, просто ответе кто знает пожалуйста
...
Рейтинг: 0 / 0
25.04.2018, 15:39
    #39636117
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Потому что пока твой код работает в потоке пользовательского интефейса, этот поток занят твоим кодом и никак не может обновлять пользовательский интерфейс.

То есть он работает, просто на экране ты не видишь изменений.
...
Рейтинг: 0 / 0
25.04.2018, 15:42
    #39636121
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.ProПотому что пока твой код работает в потоке пользовательского интефейса, этот поток занят твоим кодом и никак не может обновлять пользовательский интерфейс.

То есть он работает, просто на экране ты не видишь изменений.
То есть он обрабатывает данный кусок и зациклен на нем?А по таймеру получится или нет?
...
Рейтинг: 0 / 0
25.04.2018, 15:47
    #39636129
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Получится
...
Рейтинг: 0 / 0
25.04.2018, 16:33
    #39636190
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Pro,

Спасибо, я так и думал(про прорисовку(знал или догадывался)), просто спросил(прав ли),по таймеру работает (только что проверил)
...
Рейтинг: 0 / 0
25.04.2018, 17:48
    #39636267
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Вы можете выполнять сам метод в отдельном потоке, просто необходима синхронизация с основным потоком.
То есть можно запустить цикл в отдельном потоке и из цикла вызывать через Invoke() метод обновления картинки. Тогда интерфейс будет всегда доступен и анимация будет срабатывтаь
...
Рейтинг: 0 / 0
25.04.2018, 17:49
    #39636269
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Еще можно череp Анимацию WPF можно сделать, как мне кажется. Про анимацию в WF я не знаю, не использовал.
...
Рейтинг: 0 / 0
25.04.2018, 18:40
    #39636306
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Roman MejtesВы можете выполнять сам метод в отдельном потоке, просто необходима синхронизация с основным потоком.
То есть можно запустить цикл в отдельном потоке и из цикла вызывать через Invoke() метод обновления картинки. Тогда интерфейс будет всегда доступен и анимация будет срабатывтаь
Спасибо, про Invoke() я знаю, а вот метод обновления картинки приведите, очень прошу

Roman MejtesЕще можно череp Анимацию WPF можно сделать, как мне кажется. Про анимацию в WF я не знаю, не использовал.
спасибо, это тоже знаю, но wpf пока не учил
...
Рейтинг: 0 / 0
25.04.2018, 18:47
    #39636308
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Аниме Любительа вот метод обновления картинки приведитеТак ты же его сам написал в своем коде. Его только выполнить надо через Invoke
...
Рейтинг: 0 / 0
25.04.2018, 18:53
    #39636311
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.ProТак ты же его сам написал в своем коде. Его только выполнить надо через Invoke
Invoke.ScreenImage.Image = this.ImageList[index]; подправьте код пожалуйста, просто я не помню
Roman Mejtes пусть тоже ответит пожалуйста
...
Рейтинг: 0 / 0
25.04.2018, 19:01
    #39636315
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
...
Рейтинг: 0 / 0
25.04.2018, 19:08
    #39636319
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Pro,

Приведите пример с отоброжением моей картинки пожалуйста, вы же умеете, пожалуйста
...
Рейтинг: 0 / 0
25.04.2018, 19:48
    #39636339
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Pro,Roman Mejtes

Приведите пример с отоброжением моей картинки пожалуйста, вы же умеете, пожалуйста или кто-нибудь

Прикол, если не писать методом invoke и скомпилировать, все равно работать будет, я проверял на чужом коде, в чем прикол?, что-то же будет(какие то проблеммы), какие?
...
Рейтинг: 0 / 0
25.04.2018, 20:01
    #39636345
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
это пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
using System;
using System.Drawing;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        private Image[] _images;
        private readonly PictureBox _pictureBox;
        public Form1()
        {
            InitializeComponent();
            LoadImages();
            _pictureBox = new PictureBox()
            {
                Dock = DockStyle.Fill,
            };
            this.Controls.Add(_pictureBox);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StartSimpleAnimation();
        }

        private void StartSimpleAnimation()
        {
            int i = 0;
            Task.Run(new Action(async () =>
            {
                while (true)
                {
                    if (++i >= _images.Length) i = 0;
                    Invoke(new Action(() => { _pictureBox.Image = _images[i]; }));
                    await Task.Delay(100);
                }
            }));
        }

        private void LoadImages()
        {
            _images = new Image[73];
            for (var i = 0; i < 73; i++)
            {
                var image = GetBitmapFromUri($"https://im3.ezgif.com/tmp/ezgif-3-2d634e36e5-gif-png/frame_{i:00}_delay-0.08s.png");
                _images[i] = image;
            }
        }

        private Image GetBitmapFromUri(string url)
        {
            var uri = new Uri(url);
            using (var wc = new WebClient())
            {
                using (var stream = wc.OpenRead(uri))
                {
                    return Image.FromStream(stream);
                }
            }
        }
    }
}


Для анимирования в WF есть соотвествующий контрол, который принимает карту картинок и анимирует её, так же есть контролы с поддержкой GIF.
Пример автономный, наличия объектов на форме не требуется.
...
Рейтинг: 0 / 0
25.04.2018, 20:04
    #39636348
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
но делать через таймер будет на много лучше и более адекватно, нужно только учитывать блокировки. Потому как при таком способе, анимания не выстраивается по таймлайну, по факту это пример того, как менять картинки с задержкой в 100 мс :) а не анимация.
Для анимации нужен таймлайн, в таймлайне по заданному времени должен срабатывать метод, который будет менять кадр, в заданное время. Тогда скорость анимации можно будет контролировать и видео которое длится 10 сек, будет 10 секунд, а не хз сколько :)
...
Рейтинг: 0 / 0
25.04.2018, 20:37
    #39636368
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Roman Mejtesно делать через таймер будет на много лучше и более адекватно, нужно только учитывать блокировки. Потому как при таком способе, анимания не выстраивается по таймлайну, по факту это пример того, как менять картинки с задержкой в 100 мс :) а не анимация.
Для анимации нужен таймлайн, в таймлайне по заданному времени должен срабатывать метод, который будет менять кадр, в заданное время. Тогда скорость анимации можно будет контролировать и видео которое длится 10 сек, будет 10 секунд, а не хз сколько :)
спасибо

Прикольный вопрос всем, ответе все кто отвечал и хочет ответить пожалуйста:
Прикол, если не писать методом invoke и скомпилировать, все равно работать будет, я проверял на чужом коде, в чем прикол?, что-то же будет(какие то проблемы), какие?
...
Рейтинг: 0 / 0
26.04.2018, 02:38
    #39636466
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Аниме ЛюбительRoman Mejtesно делать через таймер будет на много лучше и более адекватно, нужно только учитывать блокировки. Потому как при таком способе, анимания не выстраивается по таймлайну, по факту это пример того, как менять картинки с задержкой в 100 мс :) а не анимация.
Для анимации нужен таймлайн, в таймлайне по заданному времени должен срабатывать метод, который будет менять кадр, в заданное время. Тогда скорость анимации можно будет контролировать и видео которое длится 10 сек, будет 10 секунд, а не хз сколько :)
спасибо

Прикольный вопрос всем, ответе все кто отвечал и хочет ответить пожалуйста:
Прикол, если не писать методом invoke и скомпилировать, все равно работать будет, я проверял на чужом коде, в чем прикол?, что-то же будет(какие то проблемы), какие?
просто сделано через async\await, но это не гарантирует, что контекст выполнения будет поток UI, еще стоит проверку сделать. Свойства Control.InvokeRequired
...
Рейтинг: 0 / 0
26.04.2018, 13:32
    #39636744
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Roman MejtesАниме Любительпропущено...

спасибо

Прикольный вопрос всем, ответе все кто отвечал и хочет ответить пожалуйста:
Прикол, если не писать методом invoke и скомпилировать, все равно работать будет, я проверял на чужом коде, в чем прикол?, что-то же будет(какие то проблемы), какие?
просто сделано через async\await, но это не гарантирует, что контекст выполнения будет поток UI, еще стоит проверку сделать. Свойства Control.InvokeRequired
Спасибо
Это я понял, вопрос в том, что-то же будет(какие то проблемы)? без Invoke и.т.д. уже не в теории, а можно увидеть на практиле, какие?
Кто нибудь знает точно?
...
Рейтинг: 0 / 0
26.04.2018, 14:17
    #39636776
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Roman Mejtesсделано через async\await, но это не гарантирует, что контекст выполнения будет поток UIПочему не гарантирует, ты же Invoke от формы вызываешь?
...
Рейтинг: 0 / 0
26.04.2018, 14:22
    #39636778
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Pro,

про мой прикольный вопрос не забудьте, мне интересно и ваше мнение
...
Рейтинг: 0 / 0
26.04.2018, 14:31
    #39636782
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Pro,

если я использую invoke то выполнится в потоке формы, но если это будет происходит в async методе, то это может быть как поток UI, так и поток какой то левый. На сколько я понимаю :)
...
Рейтинг: 0 / 0
26.04.2018, 14:37
    #39636787
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Аниме Любительпро мой прикольный вопрос не забудьте, мне интересно и ваше мнение Аниме Любительесли не писать методом invoke и скомпилировать, все равно работать будеткод покажи, а то нет предмета обсуждения
...
Рейтинг: 0 / 0
26.04.2018, 14:52
    #39636796
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.Proкод покажи, а то нет предмета обсуждения
код показать не могу, он очень большой, но готовая(скомпилированная) прога работает без invoke, как с invoke без видимой разницы, если вам интересно напишите код сами с invoke и без и убедитесь
...
Рейтинг: 0 / 0
26.04.2018, 15:01
    #39636801
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Ты же только что очень хотел ответа на свой очень интересный вопрос.

Есть несколько десятков способов реализовать это без Invoke.

Но если у тебя все работает, что зачем ты вообще создал этот топик?
...
Рейтинг: 0 / 0
26.04.2018, 15:21
    #39636813
Аниме Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация картинок работает только в потоке
Shocker.ProТы же только что очень хотел ответа на свой очень интересный вопрос.

Есть несколько десятков способов реализовать это без Invoke.

Но если у тебя все работает, что зачем ты вообще создал этот топик?
Я же написал : "Метод Animation работает только в отдельном потоке, почему?"
Это просто теоретический вопрос, интересный вопрос я придумал написать потом
Вы писали: Ты же только что очень хотел ответа на свой очень интересный вопрос
Я и сейчас хочу ответ на мой интересный вопрос
Вопрос в том, что-то же будет(какие то проблемы)? без Invoke и.т.д. уже не в теории, а можно увидеть на практике(к практике не придираться), какие?
Ответе конкретно, кто знает
Не придирайтесь
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Анимация картинок работает только в потоке / 25 сообщений из 42, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]