Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Управление потоком. / 25 сообщений из 55, страница 1 из 3
11.04.2019, 10:08
    #39799743
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Я создаю тред
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
tx_run = new Thread(new ThreadStart(SendCanFrames));
if (!tx_run.IsAlive)
{
    running = true;
    tx_run.IsBackground = true;
    tx_run.Start();
}

private void SendCanFrames()
{
    while (running)
    {

    }
}


И теперь я хочу управлять им
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void Start()
{
    tx_run.Suspend();
}

public void Stop()
{
    tx_run.Resume();
}



Но на эти два метода получаю предупреждение
авторWarning CS0618 'Thread.Suspend()' is obsolete: 'Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.

Warning CS0618 'Thread.Resume()' is obsolete: 'Thread.Resume has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.

а чем тогда пользоваться?
...
Рейтинг: 0 / 0
11.04.2019, 10:11
    #39799744
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7а чем тогда пользоваться?в сообщении же написано
use other classes in System.Threading, such as Monitor, Mutex, Event, and SemaphoreА вообще, какая задача в целом?
...
Рейтинг: 0 / 0
11.04.2019, 10:19
    #39799753
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.Projenya7а чем тогда пользоваться?в сообщении же написано
use other classes in System.Threading, such as Monitor, Mutex, Event, and SemaphoreА вообще, какая задача в целом?
запускаю треды от 1 до 4 которые посылают данные. и каждый тред обновляет данные в своем контроле который находиться на главной форме
...
Рейтинг: 0 / 0
11.04.2019, 10:20
    #39799754
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
мутексы и семафоры не останавливают тред
...
Рейтинг: 0 / 0
11.04.2019, 10:31
    #39799761
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7
Код: c#
1.
new Thread

сейчас MS это пишет за вас.
...
Рейтинг: 0 / 0
11.04.2019, 10:34
    #39799763
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7запускаю треды от 1 до 4 которые посылают данные. и каждый тред обновляет данные в своем контроле который находиться на главной формеэто не задача от пользователя.
Это решение от программиста.
...
Рейтинг: 0 / 0
11.04.2019, 10:38
    #39799764
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7запускаю треды от 1 до 4 которые посылают данные. и каждый тред обновляет данные в своем контроле который находиться на главной форме
1) данные в контроле может обновлять только поток пользовательского интерфейса и он один. В отдельных потоках можно только готовить эти данные
2) для этого придуман TPL (Task, async, await...), посмотри на год издания учебника, которым ты пользуешься, выброси его в помойку, возьми современный и забудь про new Thread
...
Рейтинг: 0 / 0
11.04.2019, 11:56
    #39799811
listtoview
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.Projenya7запускаю треды от 1 до 4 которые посылают данные. и каждый тред обновляет данные в своем контроле который находиться на главной форме
1) данные в контроле может обновлять только поток пользовательского интерфейса и он один. В отдельных потоках можно только готовить эти данные
2) для этого придуман TPL ( Task, async, await... ), посмотри на год издания учебника, которым ты пользуешься, выброси его в помойку, возьми современный и забудь про new Thread
о! спасибо!
чуть не забыл асинхронно сервис дергать
из соседней темы

а есть какие ниб рекомендации когда делать асинхронно, а когда нет?
вебсервис у меня отрабатывает до 200мс, нужно его асинхронно делать?
...
Рейтинг: 0 / 0
11.04.2019, 12:07
    #39799816
leguo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
listtoviewShocker.Proпропущено...

1) данные в контроле может обновлять только поток пользовательского интерфейса и он один. В отдельных потоках можно только готовить эти данные
2) для этого придуман TPL ( Task, async, await... ), посмотри на год издания учебника, которым ты пользуешься, выброси его в помойку, возьми современный и забудь про new Thread
о! спасибо!
чуть не забыл асинхронно сервис дергать
из соседней темы

а есть какие ниб рекомендации когда делать асинхронно, а когда нет?
вебсервис у меня отрабатывает до 200мс, нужно его асинхронно делать?


Прочитать современный учебник и сделать для себя вывод.
...
Рейтинг: 0 / 0
11.04.2019, 12:14
    #39799818
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
listtoviewа есть какие ниб рекомендации когда делать асинхронно, а когда нет?
вебсервис у меня отрабатывает до 200мс, нужно его асинхронно делать?Любые операции ввода-вывода (файл, БД, сервис) лучше делать асинхронно. 200мс - это уже много, а если еще протупит сеть или сервис - пользовательский интерфейс подвиснет.
...
Рейтинг: 0 / 0
11.04.2019, 12:36
    #39799830
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.Projenya7запускаю треды от 1 до 4 которые посылают данные. и каждый тред обновляет данные в своем контроле который находиться на главной форме
1) данные в контроле может обновлять только поток пользовательского интерфейса и он один. В отдельных потоках можно только готовить эти данные
2) для этого придуман TPL (Task, async, await...), посмотри на год издания учебника, которым ты пользуешься, выброси его в помойку, возьми современный и забудь про new Thread
Так как делать? Практически.
...
Рейтинг: 0 / 0
11.04.2019, 12:36
    #39799831
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
listtoviewкогда делать асинхронно, а когда нет?есть. Не пихать его в каждую дырку.
listtoviewнужно его асинхронно делать?нет
...
Рейтинг: 0 / 0
11.04.2019, 12:38
    #39799833
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7Так как делать? Практически.Написать требования по ТЗ не для программиста, а от пользователя. Что ему нужно., а не тебе.
...
Рейтинг: 0 / 0
11.04.2019, 12:43
    #39799836
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7Так как делать? Практически.Обчём вопрос? Ты описал задачу так:

jenya7запускаю треды от 1 до 4 которые посылают данные.используй await и Task-и вместо запуска тредовjenya7 и каждый тред обновляет данные в своем контроле который находиться на главной формеэто невозможно, эти треды не могут обновлять контролы, так как контролы может обновлять только поток пользовательского интерфейса. Можно, конечно, использовать .Invoke() на контроле, но обычно проще и понятнее получать данные в отдельном потоке, а обновлять в основном.
...
Рейтинг: 0 / 0
11.04.2019, 13:14
    #39799854
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Я создал пользовательский контрол. Два грида. Верхний отображает входящие сообщения, нижний исходящие.
И контрол включает методы
Код: 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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
        public void RunTX()
        {   
            tx_run = new Thread(new ThreadStart(SendCanFrames));
            if (!tx_run.IsAlive)
            {
                tx_run.IsBackground = true;
                tx_run.Start();
            }
        }

        public void RunRX()
        {
            rx_run = new Thread(new ThreadStart(ReadCanFrames));
            if (!rx_run.IsAlive)
            {
                rx_run.IsBackground = true;
                rx_run.Start();
            }
        }

private void ReadCanFrames()
        {
            ushort prev_time_stamp = 0;

            while (running)
            {
                if (CanDevice != null)
                    CanDevice.Read(ref rx_can_msg, 1, ref read_cnt);

                if (read_cnt == 1)
                {
                    read_cnt = 0;

                    this.Invoke(
                         (MethodInvoker)delegate
                         {
                             dataGridViewCanRx.Rows[0].Cells[0].Value = rx_can_msg[0].Id.ToString("X");
                             dataGridViewCanRx.Rows[0].Cells[1].Value = rx_can_msg[0].Size.ToString();
                             dataGridViewCanRx.Rows[0].Cells[2].Value = BytesToString(rx_can_msg[0].Data);
                             dataGridViewCanRx.Rows[0].Cells[3].Value = (rx_can_msg[0].TimeStamp - prev_time_stamp).ToString();
                         });

                    prev_time_stamp = rx_can_msg[0].TimeStamp;
                }

                prev_time_stamp = rx_can_msg[0].TimeStamp;
            }
        }

        private void SendCanFrames()
        {
            if (tx_can_msg.Length == 0) return;

            VSCAN_MSG[] l_msgs = new VSCAN_MSG[2];

            while (running)
            {
                for (int i = 0; i < tx_can_msg.Length; i++)
                {
                    if (can_messages[i].CountRun < can_messages[i].CountMax)
                    {
                        can_messages[i].TimeStamp1 = DateTime.Now;
                        interval = can_messages[i].TimeStamp1 - can_messages[i].TimeStamp2;

                        if (interval.TotalMilliseconds >= can_messages[i].Period)
                        {
                            can_messages[i].TimeStamp2 = DateTime.Now;

                            l_msgs[0] = tx_can_msg[i];

                            //send CAN frame
                            CanDevice.Write(l_msgs, 1, ref written_cnt);
                            // send immediately 
                            CanDevice.Flush();

                            can_messages[i].CountRun++;

                            this.Invoke(
                                 (MethodInvoker)delegate
                                 {
                                     dataGridViewCanTx.Rows[i].Cells[4].Value = can_messages[i].CountRun.ToString();
                                 });

                            Thread.Sleep(can_messages[i].Delay);
                        }
                    }
                }
            }
        }


И таких четыре контрола я ставлю на главную форму и запускаю. Но работает плохо. Сильно тормозит. Такое ощущение что потоки мешают друг другу.
...
Рейтинг: 0 / 0
11.04.2019, 13:19
    #39799857
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
так это выглядит на главной форме
...
Рейтинг: 0 / 0
11.04.2019, 13:24
    #39799862
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7Такое ощущение что потоки мешают друг другу.Мешают что? Обновлять содержимое контролов. Мешают конечно, потому что обновление идет В ОДНОМ потоке.
...
Рейтинг: 0 / 0
11.04.2019, 13:34
    #39799868
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.Projenya7Такое ощущение что потоки мешают друг другу.Мешают что? Обновлять содержимое контролов. Мешают конечно, потому что обновление идет В ОДНОМ потоке.
Почему в одном? я запускаю 4 контрола а в каждом свой поток
Код: 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.
private void buttonStartAll_Click(object sender, EventArgs e)
        {
            int can_channel;
            for (can_channel = 0; can_channel < 4; can_channel++)
            {
                if (started[can_channel] == false)
                {
                    if (connected[can_channel] == true)
                    {
                        switch (can_channel)
                        {
                            case 0:
                                mainform.userControlCan1.Start();
                                mainform.userControlCan1.RunTX();
                                mainform.userControlCan1.RunRX();
                                buttonCan4Start.Text = "STOP";
                                started[can_channel] = true;
                                break;
                            case 1:
                                mainform.userControlCan2.Start();
                                mainform.userControlCan2.RunTX();
                                mainform.userControlCan2.RunRX();
                                buttonCan4Start.Text = "STOP";
                                started[can_channel] = true;
                                break;
                            case 2:
                                mainform.userControlCan3.Start();
                                mainform.userControlCan3.RunTX();
                                mainform.userControlCan3.RunRX();
                                buttonCan4Start.Text = "STOP";
                                started[can_channel] = true;
                                break;
                            case 3:
                                mainform.userControlCan4.Start();
                                mainform.userControlCan4.RunTX();
                                mainform.userControlCan4.RunRX();
                                buttonCan4Start.Text = "STOP";
                                started[can_channel] = true;
                                break;
                        }
                    }
                }
            }
        }
...
Рейтинг: 0 / 0
11.04.2019, 13:45
    #39799881
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7Почему в одном? я запускаю 4 контрола а в каждом свой поток https://habr.com/ru/post/242937/
...
Рейтинг: 0 / 0
11.04.2019, 13:47
    #39799886
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7Почему в одном?я написал это несколько раз, но ты упорно не желаешь обращать на это внимание
Shocker.Proданные в контроле может обновлять только поток пользовательского интерфейса и он один
...
Рейтинг: 0 / 0
11.04.2019, 13:56
    #39799899
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Кто о чём, а автор о своем)).
...
Рейтинг: 0 / 0
11.04.2019, 14:01
    #39799906
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.Projenya7Почему в одном? я запускаю 4 контрола а в каждом свой поток https://habr.com/ru/post/242937/
Сделать как в примере? Но что для меня private void UpdateUI ? что именно обновлять в этом методе?
...
Рейтинг: 0 / 0
11.04.2019, 14:06
    #39799914
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Слушай, кто программист на твоем проект - ты или я?
Я тебе указываю в твои пробелы в знаниях, даю ключевые слова, даю ссылки на примеры и т.п. для того, чтобы ты в вопросе попытался разобраться.
А ты вместо этого с подходом "ну и откуда тут скопипастить"?
...
Рейтинг: 0 / 0
11.04.2019, 14:12
    #39799921
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
Shocker.ProСлушай, кто программист на твоем проект - ты или я?
Я тебе указываю в твои пробелы в знаниях, даю ключевые слова, даю ссылки на примеры и т.п. для того, чтобы ты в вопросе попытался разобраться.
А ты вместо этого с подходом "ну и откуда тут скопипастить"?
а почему не скопипастить правильное решение? что тут криминального?
...
Рейтинг: 0 / 0
11.04.2019, 14:13
    #39799923
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление потоком.
jenya7а почему не скопипастить правильное решение? что тут криминального?книжку возьми 2019 года, а не хабр)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Управление потоком. / 25 сообщений из 55, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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