Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257

Ожидание действия пользователя. Многопоточность

04.03.2014, 23:34. Показов 2241. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, такая проблема: Есть ЧекБокс, при нажатии на него появляется анимация (цикл, в котором я рисую на PictureBox). При повторном нажатии я хочу прекратить вывод анимации, но когда я ее кручу в цикле, программа как бы виснет, я не могу снова нажать на ЧекБокс.
Думаю надо вводить многопоточность: в одном потоке крутиться анимация, в другом ждем когда пользователь нажмет на ЧекБокс, но я во всем этом не шарю. Пробовал делать через Thread и BackgroundWorker - ничего не получилось. Помогите пожалуйста.

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
private void ShowGif()
        {
            //выводим анимацию
            while (checkBox1.Checked)//вот он этот злосчастный цикл, должен завершится при повторном нажатии на ЧекБокс
            {
                for (int i = 0; i < Rings.Count; ++i)
                {
                    if ((Rings[i].Radius - step) >= 0)
                        Pic.DrawEllipse(new Pen(Rings[i].Col), T.X - (Rings[i].Radius/2), T.Y - (Rings[i].Radius/2), Rings[i].Radius, Rings[i].Radius);
                    if (Rings[i].Radius <= 1)
                    {
                        Ring Rng = new Ring();
                        Rng.Col = Rings[i].Col;
                        Rng.Radius = Rings.Count*distance;
                        Rings[i] = Rng;
                    }
                    else
                    {
                        Ring Rng = new Ring();
                        Rng.Col = Rings[i].Col;
                        Rng.Radius = Rings[i].Radius - step;
                        Rings[i] = Rng;
                    }
                }
                pictureBox1.Refresh();
                Pic.Clear(Color.White);
            }
        }
 
private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (((CheckBox)sender).Checked)
            {
                //Отключаем все элементы перед анимацией
                EnableOff();
                //Снимаем данные с контролов
                distance = trackBar_distance.Value * 10;
                step = trackBar_speed.Value;
                //создаем массив колец
                Create();
                //отрисовываем анимацию
                ShowGif();
                //очищаем массив колец
                Rings.Clear();
                //Включаем все элементы перед анимацией
                EnableOn();
            }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2014, 23:34
Ответы с готовыми решениями:

Ожидание действия пользователя
Всем привет! Помогите новичку, пожалуйста Пишу программу, которая тебя приветствует в richtextbox, потом принимает твое имя в...

Ожидание ответа пользователя и его обработка
Задача: Получить от пользователя на форме ответ &quot;Правда&quot; или &quot;Ложь&quot; по нажатию соответствующей кнопки, получить булево значение, сравнить...

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

4
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.03.2014, 23:52
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Запросто.
Только имейте ввиду, что обращаться к форме из другого потока надо по другому, чем обычно. Думаю, разберетесь, там все понятно как обновлять форму из другого потока.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication21
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            checkBox1.CheckedChanged+=new EventHandler(checkBox1_CheckedChanged);
        }
        void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            Thread thr = new Thread(new ThreadStart(Run));
            thr.IsBackground = true;
            if (checkBox1.Checked)
                thr.Start();           
        }
        
        void Run()
        {
            int count = 0;
            do
            {
                if (label1.InvokeRequired)//Тут Ваша анимация и т.п. 
                    label1.Invoke(new Action(() => label1.Text = count.ToString()));
                Thread.Sleep(500);
                count++;
                if (this.InvokeRequired)
                    this.Invoke(new Action(() => this.Refresh()));
            }
            while (checkBox1.Checked);
        }
    }
}
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
05.03.2014, 00:26  [ТС]
insite2012, С инвоками не могу разобраться, куда их ставить, для чего они нужны, зачем тут лэйбл. Напишите плз как будет выглядеть моя функция ShowGif()
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.03.2014, 00:38
label тут просто для примера. Вот так я рисую постоянно одну линию.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication21
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            checkBox1.CheckedChanged+=new EventHandler(checkBox1_CheckedChanged);
        }
        void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            Thread thr = new Thread(new ThreadStart(Run));
            thr.IsBackground = true;
            if (checkBox1.Checked)
                thr.Start();           
        }
        
        void Run()
        {
            do
            {
                this.Invoke(new Action(() => this.Draw()));
                Thread.Sleep(100);
                this.Invoke(new Action(() => this.Refresh()));
            }
            while (checkBox1.Checked);
            this.Invoke(new Action(() => this.BackColor = Color.FromKnownColor(KnownColor.Control)));
        }
        void Draw()
        {
            var g = this.CreateGraphics();
            var pen = new Pen(Color.Black, 4.0f);
            g.DrawLine(pen, 10, 10, 100, 100);
        }
    }
}
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
05.03.2014, 01:15  [ТС]
К сожалению я так ничего и не понял (извините), но решение проблемы нашел: добавил в цикл Application.DoEvents(); и теперь есть реакция на повторный клик. )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2014, 01:15
Помогаю со студенческими работами здесь

Служба записывающая действия пользователя
Здравствуйте! Нужно написать Windows-службу которая в некий файл записывала бы действия пользователя, например в таком формате: &quot;10.25...

Ожидание действия на форме
Пытаюсь создать форму с полем &quot;Password&quot; и функцией getPassword, которая при вызове рисует форму, ждет действия пользователя (нажатия в...

Многопоточность. Дождаться конца предыдущего действия
Коротко: У меня в кода есть функция DoEveryThing(); Она выполняется в таймере. И все вызовы других функций и все прочее,...

Длительный запрос с клиента (ожидание действия на сайте)
Ребят помогите сделать, мне нужно чтобы мой клиент на C# посылал запрос на сайт long poll или как это называется и ждал пока придет...

Ожидание клика пользователя
Здравствуйте!!!Подскажите пожалуйста,есть ли метод, ожидающий клика пользователя или переменная возвращающая булевое или компонентное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru