Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI поток виснет при запуске другого потока / 16 сообщений из 16, страница 1 из 1
01.11.2021, 17:13
    #40108664
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
есть функция
Код: 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.
private async Task Discover()
{
    int timeout = 0;

    for (byte i = 1; i < range; i++)
    {
        timeout = 0;
        sens_data[2] = i;

       net_udp_socket.Send(sens_data, TextBoxRemoteIP.Text, port);

        Invoke((MethodInvoker)async delegate
        {
            while (udp_msg_rx_ok == 0)
            {
                Thread.Sleep(1);
                timeout++;
                if (timeout >= 1000)
                {
                     RichTextBoxNetReceive.AppendText("ID " + i.ToString() + " timeout\n");
                      break;
                 }
            }

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

                  RichTextBoxNetReceive.AppendText("ID " + i.ToString() + " discovered\n");
              }
        });

        Application.DoEvents();
    }
}


запускаю в отдельном потоке
Код: c#
1.
Task.Run(() => Discover());



И все виснет. Тут по идее должно быть что то близкое к секунде
Код: c#
1.
2.
3.
Thread.Sleep(1);
timeout++;
if (timeout >= 1000)


на самом деле в разы больше. и текст RichTextBoxNetReceive печатается с опозданием и сразу несколько строк.
...
Рейтинг: 0 / 0
01.11.2021, 19:09
    #40108687
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Так ты же Thread.Sleep выполняешь в потоке GUI - чего б ему не виснуть?
...
Рейтинг: 0 / 0
02.11.2021, 03:52
    #40108736
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
jenya7,

тот кто использует таски - орёл,
а тот кто использует трэды - баклан
...
Рейтинг: 0 / 0
02.11.2021, 09:32
    #40108749
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Shocker.Pro
Так ты же Thread.Sleep выполняешь в потоке GUI - чего б ему не виснуть?

а как мне подождать готовности данных? можно выполнить Sleep в этом потоке? я могу поставить в while Application.DoEvents() и тогда все в порядке но это решение так себе.
...
Рейтинг: 0 / 0
02.11.2021, 09:35
    #40108750
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
pation
jenya7,

тот кто использует таски - орёл,
а тот кто использует трэды - баклан

с таском такая же ситуация
...
Рейтинг: 0 / 0
02.11.2021, 09:43
    #40108751
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Зачем ты вообще выполняешь цикл ожидания в Invoke? Ты с тем же успехом можешь выполнять вот этот же код без всякого Task.Run(() => Discover()); - будет абсолютно то же самое
...
Рейтинг: 0 / 0
02.11.2021, 09:43
    #40108752
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Ты смысл Invoke в принципе понимаешь?
...
Рейтинг: 0 / 0
02.11.2021, 09:56
    #40108753
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Shocker.Pro
Зачем ты вообще выполняешь цикл ожидания в Invoke? Ты с тем же успехом можешь выполнять вот этот же код без всякого Task.Run(() => Discover()); - будет абсолютно то же самое

без Invoke при обращении к GUI - RichTextBoxNetReceive.AppendText("ID " + i.ToString() + " timeout\n"); я получаю - cross thread exception
а как без while?
...
Рейтинг: 0 / 0
02.11.2021, 10:02
    #40108755
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
jenya7
без Invoke при обращении к GUI
само собой. обновлять GUI нужно в потоке GUI. Но зачем у тебя цикл внутри Invoke? я об этом спрашивал. Зачем ты вообще запускаешь этот код в отдельной таске, чтобы потом его выполнять в потоке GUI?
...
Рейтинг: 0 / 0
02.11.2021, 10:09
    #40108756
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Shocker.Pro
jenya7
без Invoke при обращении к GUI
само собой. обновлять GUI нужно в потоке GUI. Но зачем у тебя цикл внутри Invoke? я об этом спрашивал. Зачем ты вообще запускаешь этот код в отдельной таске, чтобы потом его выполнять в потоке GUI?

в GUI я только высвечиваю сообщения. не ждать же окончания таска а потом вывалить все сообщения в GUI.

может так - вместо while
Код: c#
1.
await Task.Run(() => WaitRxFlagReady());



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private int WaitRxFlagReady()
{
       int timeout = 0;

       while (udp_msg_rx_ok == 0)
       {
                Thread.Sleep(1);
                timeout++;
                if (timeout >= 100)
                {
                    return 0;
                }
       }

     return 1;
}
...
Рейтинг: 0 / 0
02.11.2021, 10:26
    #40108759
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
мда. чтож это получается - Thread.Sleep(1); всегда выполнится в потоке GUI? нельзя это делать в другом потоке?
...
Рейтинг: 0 / 0
02.11.2021, 11:43
    #40108765
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
jenya7
в GUI я только высвечиваю сообщения.
нет, в GUI у тебя весь внутренний цикл, включая Thread.Sleep

jenya7
Thread.Sleep(1); всегда выполнится в потоке GUI?
Где ты его разместил, там он и выполняется, в данном случае ты его разместил в потоке GUI
...
Рейтинг: 0 / 0
02.11.2021, 22:54
    #40108863
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Task.Delay, в чем проблема? Есть еще Dispatcher.Yeald, как вариант, чтоб вернуться в контекст синхронизации.
...
Рейтинг: 0 / 0
02.11.2021, 23:46
    #40108865
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Roman Mejtes
Task.Delay, в чем проблема?
Task.Delay на одну миллисекунду? Смысл? Там и Thread.Sleep-то не особо нужен. Пока ТС не поймет, что такое Invoke, и не вынесет цикл за его пределы, у него все будет тормозить, что с Task.Delay, что без
...
Рейтинг: 0 / 0
03.11.2021, 09:52
    #40108900
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
Shocker.Pro
Roman Mejtes
Task.Delay, в чем проблема?
Task.Delay на одну миллисекунду? Смысл? Там и Thread.Sleep-то не особо нужен. Пока ТС не поймет, что такое Invoke, и не вынесет цикл за его пределы, у него все будет тормозить, что с Task.Delay, что без


сделал так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
while (udp_msg_rx_ok == 0)
{
     Thread.Sleep(1);
     timeout++;
     if (timeout >= 100)
     {
         Invoke((MethodInvoker)async delegate
          {
                 RichTextBoxNetReceive.AppendText("ID " + i.ToString() + " timeout\n");
         });
         break;
    }
}


ничего не изменилось.
единственное решение которое я смог придумать
Код: c#
1.
2.
3.
4.
private void timerMsCounter_Tick(object sender, EventArgs e)
{
     ms_counter++;
}
...
Рейтинг: 0 / 0
09.11.2021, 18:22
    #40110415
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI поток виснет при запуске другого потока
jenya7,

как у тебя вообще получается, что и soket-ы и UI находятся в одном проекте?
я уж не говорю, что в одном классе
и молчу о том, что даже в одном методе
используй single responsibility и сразу поймёшь проблему и способы её решения
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI поток виснет при запуске другого потока / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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