powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI поток виснет при запуске другого потока
16 сообщений из 16, страница 1 из 1
GUI поток виснет при запуске другого потока
    #40108664
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.
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
GUI поток виснет при запуске другого потока
    #40108687
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ты же Thread.Sleep выполняешь в потоке GUI - чего б ему не виснуть?
...
Рейтинг: 0 / 0
GUI поток виснет при запуске другого потока
    #40108736
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

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

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

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

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

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

jenya7
Thread.Sleep(1); всегда выполнится в потоке GUI?
Где ты его разместил, там он и выполняется, в данном случае ты его разместил в потоке GUI
...
Рейтинг: 0 / 0
GUI поток виснет при запуске другого потока
    #40108863
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Task.Delay, в чем проблема? Есть еще Dispatcher.Yeald, как вариант, чтоб вернуться в контекст синхронизации.
...
Рейтинг: 0 / 0
GUI поток виснет при запуске другого потока
    #40108865
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
Task.Delay, в чем проблема?
Task.Delay на одну миллисекунду? Смысл? Там и Thread.Sleep-то не особо нужен. Пока ТС не поймет, что такое Invoke, и не вынесет цикл за его пределы, у него все будет тормозить, что с Task.Delay, что без
...
Рейтинг: 0 / 0
GUI поток виснет при запуске другого потока
    #40108900
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
GUI поток виснет при запуске другого потока
    #40110415
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

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


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