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

TrackBar

30.01.2016, 16:29. Показов 975. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, помогите пожалуйста.
У меня есть какая-то функция, она точно работает к ней претензий нет.
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
private void Check(string PortName)
        {
            double f=0;
            byte i=0;
            byte[] buf=new byte[1];
            var port = new Port(PortName);
            int k = Convert.ToInt32(Convert.ToDouble(textBoxVolt.Text) / (5.0 / 1024.0));
            port.SetData(buf);
            Thread.Sleep(10);
            while (DateTime.Now.AddMinutes(0) <= time)
            {           
                f = port.GetData();
                Plot(f * (5.0 / 1024.0));
                if (((k - f) < -5) || (k - f) > 5)
                {
                    if (f < k)
                    {
                        i++;
                    }
                    else 
                    {
                        if (i == 0)
                        {
                            i = 0;
                        }
                        else
                        {
                            i--;
                        }
                    }
 
                    buf = new byte[] { i };
                    Digit(i);
                    Thread.Sleep(10);
                }
                port.SetData(buf);
            }
            port.Dispose();
        }
В значение переменной k я получаю из текст бокса, но мне нужно сделать так, чтобы я мог задать значение в текст боксе, а в процессе выполнения программы, я мог бы трекбаром менять это k. Во-первых проблема в том, что я не могу обратиться из другого потока, даже если использую
C#
1
if(trackBar1.InvokeRequired)
.
Вот что у меня в баттонклике
C#
1
2
3
4
5
6
7
private async void button1_Click(object sender, EventArgs e)
        {
            chart1.Series[0].Points.Clear();
            time = DateTime.Now.AddMinutes(Convert.ToDouble(textBoxTime.Text));
            var PortName = comboBox1.SelectedItem as string;
            await Task.Run(() => Check(PortName));
        }
Помогите пожалуйста, кто знает как из другого потока трекбаром изменить значение переменной k.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2016, 16:29
Ответы с готовыми решениями:

Trackbar
Как сделать что бы trackbar принудительно был в положении как на изображение, но при этом 3D фигура...

C# trackBar
Здравствуйте, как установить ползунок в объекте trackBar в нужное мне положение из программы?

trackBar
Как в трекбаре можно сделать шаг 0,5, а не 1?

Негатив и trackBar
private Bitmap Invery(Bitmap bmpImg,decimal P) { Bitmap result1 = new...

4
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.01.2016, 18:59 2
Цитата Сообщение от Sasha95 Посмотреть сообщение
Помогите пожалуйста, кто знает как из другого потока трекбаром изменить значение переменной k.
1) Создайте отдельный класс
2) В этот класс вынесите метод Check
3) В этом классе сделайте публичные поля:
C#
1
2
3
string PortName{get;set;}
double K{get;set;}
//и т.д.
4) Запускайте метод Check в отдельном потоке (как оно сейчас у вас и сделано)
5) При изменении трекбара/текстбокса - заносите значение в свойство K.
0
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 41
30.01.2016, 21:06  [ТС] 3
Идея конечно же хороша, но тут есть проблемы. Во-первых, у меня в методе Check присутствуют вызовы других методов которые должны работать в другом потоке. Во-вторых, там есть контролы, которые с других классов я не знаю как обрабатывать(например тектсбоксвольт). Если я новый класс делаю статическим, то с ним вообще беда, могли бы вы мне помочь в этом деле или какой-нибудь другой способ предложить ? На всякий случай скину вам методы Plot и Digit.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  void Plot(double i)
        {
            Invoke((MethodInvoke)delegate()
            {
                chart1.Series[0].Points.AddY(i);
                //  chart1.Series[0].Label = i.ToString();
            });
        }
        void Digit(byte i)
        {
            Invoke((MethodInvoke)delegate()
            {
                label3.Text = i.ToString();
            });
        }
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.01.2016, 21:23 4
Цитата Сообщение от Sasha95 Посмотреть сообщение
Во-первых, у меня в методе Check присутствуют вызовы других методов которые должны работать в другом потоке.
События в помощь. Ваш класс должен генерировать события, например DataReceived. На эти события подписывается форма (или что там у вас) и в обработчике вызывает методы Plot или Digit.
Например ваш класс может выглядеть так:
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
    class Foo
    {
        public event EventHandler<DataReceivedEventArgs<double>> FReceived = delegate { };
        public event EventHandler<DataReceivedEventArgs<byte>> IReceived = delegate { };
 
        public double K { get; set; }
        public double PortName { get; set; }
 
        public void Check()
        {
            double f = 0;
            byte i = 0;
            byte[] buf = new byte[1];
            var port = new Port(PortName);
            port.SetData(buf);
            Thread.Sleep(10);
            while (DateTime.Now.AddMinutes(0) <= time)
            {
                f = port.GetData();
 
                //Plot(f * (5.0 / 1024.0));
                FReceived(this, new DataReceivedEventArgs<double>{Data = f});//вызываем событие
 
                if (((K - f) < -5) || (K - f) > 5)
                {
                    if (f < K)
                    {
                        i++;
                    }
                    else
                    {
                        if (i == 0)
                        {
                            i = 0;
                        }
                        else
                        {
                            i--;
                        }
                    }
 
                    buf = new byte[] { i };
 
                    //Digit(i);
                    IReceived(this, new DataReceivedEventArgs<byte> { Data = i });//вызываем событие
 
                    Thread.Sleep(10);
                }
                port.SetData(buf);
            }
            port.Dispose();
        }
    }
 
    class DataReceivedEventArgs<T> : EventArgs
    {
        public T Data { get; set;}
    }
0
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 41
31.01.2016, 09:30  [ТС] 5
Спасибо за ответ, но я что-то совсем не понял как мне дальше это использовать, получается я буду в
C#
1
2
3
4
5
6
7
8
 public partial class Form1 : Form
    {
        
        public Form1()
        {
 
        }
    }
создавать экземпляр своего класса, а как теперь с методами Plot и Digit работать не понимаю.
0
31.01.2016, 09:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2016, 09:30
Помогаю со студенческими работами здесь

Использование trackBar
Ребята помогите пожалуйста! Тут у меня сложилась такая проблема: решил я сделать программу для...

Работа с trackbar
Как с помощью trackbar менять цвет panel?

Использование double в trackbar
Здравствуйте! Подскажите, пожалуйста, как использовать десятичные значения в trackbar? Необходимо,...

Объединить 6 trackBar в один
Есть код,в котором используются 6 trackBar, хотелось бы не прописывать каждый,как можно сократить...


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

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