Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 30
1
.NET 4.x

Синхронизация

28.02.2016, 16:43. Показов 1408. Ответов 12

Author24 — интернет-сервис помощи студентам
Есть два компонента progressbar и trackbar в методе timer_Tick, как сделать так чтобы они работали синхронно, а не "один другого догоняет"?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2016, 16:43
Ответы с готовыми решениями:

Синхронизация потоков
Подскажите как сделать так, чтоб потоки выполнялись по порядку вот такой простой код using...

Синхронизация (потоки)
Здравствуйте, есть вот такое вот задание: Разработать программу, которая запускает новый поток при...

Синхронизация SQLServer и с#
Доброе время суток у меня есть проблема. Есть оболочка и база данных и есть 2 таблицы с 1...

Синхронизация потоков
Отлавливаю подключение флешки protected override void WndProc(ref Message m) { ...

12
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.02.2016, 17:05 2
Цитата Сообщение от mmo Посмотреть сообщение
сделать так чтобы они работали синхронно
Ятд, менять их значение в одном и том же обработчике.
0
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 30
28.02.2016, 17:10  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
Ятд, менять их значение в одном и том же обработчике.
C#
1
2
3
4
5
        private void timer1_Tick(object sender, EventArgs e)
        {
            trackBar2.Value = (int)reader.CurrentTime.TotalSeconds;
            progressBar1.Value = trackBar2.Value;
        }
Они и были в одном, но все равно опаздывают друг за другом
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.02.2016, 17:13 4
Цитата Сообщение от mmo Посмотреть сообщение
reader
А что это за переменная?
0
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 30
28.02.2016, 17:15  [ТС] 5
Цитата Сообщение от insite2012 Посмотреть сообщение
А что это за переменная?
C#
1
2
3
using NAudio.Wave;
 
AudioFileReader reader;
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
28.02.2016, 17:24 6
mmo, нужны значения одинаковые, целые, в диапазоне от 0 до 100 с шагом 1 (это можно изменить). И у trackBar , и у progressBar, одинаковые.
Диапазон у этих контролов указывается явно.
0
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 30
28.02.2016, 17:36  [ТС] 7
Цитата Сообщение от Rius Посмотреть сообщение
mmo, нужны значения одинаковые, целые, в диапазоне от 0 до 100 с шагом 1 (это можно изменить). И у trackBar , и у progressBar, одинаковые.
Диапазон у этих контролов указывается явно.
C#
1
2
progressBar1.Maximum = (int)reader.TotalTime.TotalSeconds;
trackBar2.Maximum = (int)reader.TotalTime.TotalSeconds;
Проблема не в том что они имеют разные значения, а в том что они двигаются не синхронно, на одинаковую позицию с задержкой где-то в чуть меньше секунды.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
28.02.2016, 17:44 8
Лучший ответ Сообщение было отмечено mmo как решение

Решение

Проверил, действительно.
При назначении значения ProgressBar'у оно запаздывает на некоторое время. Если значение увеличиватеься не на 1, а более, то видно, как ProgressBar проходит через промежуточные значения.
Причём происходит такое при увеличении значения ProgressBar вверх. Время на эти промежуточные шаги на взгляд примерно одинаково, что для 1, что для 100.
А вот при уменьшении такого эффекта нет, всё мгновенно.

Добавлено через 2 минуты
А вот объединить, и увеличить на сколько нужно +1, а потом уменьшить на 1, то будет типа мгновенно.
Грязный хак.

Добавлено через 2 минуты
Вы не первый наткнулись: http://stackoverflow.com/quest... ging-value

This animation feature was introduced in Vista with the Aero theme.

There is a workaround though. If you move the progress backwards, the animation is not shown. So if you want it to advance by 50 instantly, increment Value by 51, then immediately decrement by 1.

You get into strife when close to 100% because you can't set Value to 101 (I'm assuming Maximum is set to 100). Instead set Maximum to 1000, say, increase to 1000, decrease to 999, and then move back to 1000.

Anyway, it's kind of weird, but it does have the benefit of giving you the desired effect!
Т.е. если надо 100, то ставим 100, потом 99, потом снова 100. И типа мгновенно.
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.02.2016, 17:48 9
Цитата Сообщение от Rius Посмотреть сообщение
При назначении значения ProgressBar'у оно запаздывает на некоторое время.
Rius, да, я тоже проверил. Но пока все что мне удалось добиться - чтобы было наоборот, таким вот приемом. Теперь TrackBar у меня запаздывает)))
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
67
68
69
70
71
72
73
74
75
76
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;
 
namespace WindowsFormsApplication3 {
    public partial class Form1 : Form {
        Timer timer = null;
        MyProgressBar bar = new MyProgressBar();
        int i = 0;
 
        public Form1() {
            InitializeComponent();
            bar = new MyProgressBar();
            bar.Parent = this;
            bar.Size = new Size(260, 23);
            bar.Location = new Point(12, 197);
            bar.PaintEvent += new EventHandler(bar_PaintEvent);
            button1.Click += new EventHandler(button1_Click);
        }
 
        void bar_PaintEvent(object sender, EventArgs e) {
            int v = (sender as MyProgressBar).Value;
            trackBar1.Value = v;
        }
 
        void button1_Click(object sender, EventArgs e) {
            if (timer != null) {
                timer.Stop();
                bar.Value = 0;
                i = 0;
            }
            trackBar1.Maximum = 10;
            bar.Maximum = 10;
 
            timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }
 
        void timer_Tick(object sender, EventArgs e) {
            i += 1;
            if (i == 10) {
                bar.Value = 0;
                trackBar1.Value = 0;
                i = 0;
                (sender as Timer).Stop();
            }
            
            bar.Value = i;
        }
    }
    class MyProgressBar : ProgressBar {
        public event EventHandler PaintEvent = null;
        protected virtual void OnPaintEvent(EventArgs e) {
            if (PaintEvent != null) {
                PaintEvent(this, e);
            }
        }
        public new int Value {
            get {
                return base.Value;
            }
            set {
                EventArgs arg = EventArgs.Empty;
                OnPaintEvent(arg);
                base.Value = value;
            }
        }
    }
}
0
Rius
28.02.2016, 17:49
  #10

Не по теме:

insite2012, сурово!!! :)

0
0 / 0 / 0
Регистрация: 30.10.2014
Сообщений: 30
28.02.2016, 17:50  [ТС] 11
Работает с вариантом Rius, интересное решение.

P.S.:жаль не очень красивое
0
insite2012
28.02.2016, 17:53
  #12

Не по теме:

Rius, а куда деваться, надо же экспериментировать :)

0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,660
Записей в блоге: 14
28.02.2016, 18:05 13
mmo, это видимо следует из той самой Aero, когда к старым программам захотели добавить анимации, которую они в принципе не умели.
Чуть красивее можно сделать через Extension метод:
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
    public static class ProgressBarExtension
    {
        public static void SetValueWithoutAnimation(this ProgressBar bar, int value)
        {
            if (value >= bar.Minimum && value <= bar.Maximum)
            {
                if (value < bar.Maximum)
                {
                    bar.Value = value + 1;
                    bar.Value = value;
                }
                else
                {
                    bar.Value = value;
                    
                    if (value > bar.Minimum + 1)
                    {
                        bar.Value--;
                        bar.Value++;
                    }
                }
            }
        }
    }
C#
1
this.progressBar1.SetValueWithoutAnimation(Convert.ToInt32(this.numericUpDown1.Value));
1
28.02.2016, 18:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2016, 18:05
Помогаю со студенческими работами здесь

Синхронизация потоков
Добрый день народ ну уже сижу час четвертый, знаний не хватает в общем. Такая ситуация есть 2...

синхронизация потоков
Добрый вечер! Имеется несколько потоков, каждый поток выполняет генетический алгоритм, как их...

Синхронизация потоков
Гуглю уже долго, а ответа все так и не нашел. Ситуация такая. У меня есть метод, который выполняют...

Синхронизация папок
Задача - синхронизация выбранной папки между компьютерами. На одном стоит Windows7, на втором -...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru