Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119

Подвисание приложения во время работы потоков

11.05.2022, 13:43. Показов 1628. Ответов 13

Студворк — интернет-сервис помощи студентам
Доброго времени. Есть код типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(условие1)
{
thread t1(func1,arg);
}
if(условие2)
{
thread t2(func2,arg);
}
if(условие3)
{
thread t3(func3,arg);
}
 
//join потоки
Весь этот блок запускается из другого потока.
При работе всех потоков сильно падает отклик всех приложений и ОС в целом. По завершению работы t1, t2 или t3 (любого из) отклик системы возвращается. В диспетчере рядом с программой стоит метка "Эта группа процессов UWP используется для приостановки процессов в целях повышения производительности системы". В чем может быть проблема и как ее "лечить"? Спасибо.

Windows 10
MSVS 2015

i3-8100
Количество ядер 4
Количество потоков 4
Базовая тактовая частота процессора 3,60 GHz

Добавлено через 5 часов 15 минут
При запуске потоков через afxbeginthread подобных проблем не возникает, но приложение не отрабатывает потоки, если запускать через .exe.

В первом случает нагрузка процессора около 18%, во втором около 60%.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2022, 13:43
Ответы с готовыми решениями:

Распараллеливание с помщью потоков. Время работы
Здравствуйте! Написал программу, которая должна распараллеливать умножение матриц A=\{a_{ik}\} \in M(m\times n), B=...

Во время работы приложения, звук исчезает через некоторое время
Доброго всем суток. Разработал одно прижение, нажимаешь кнопки и соответствующее слово озвучивается. Через 15-20 итераций, звук вовсю...

Сложить матрицы с помощью потоков и узнать время работы
Добрый вечер дорогие форумчане. Такая задача: сложить матрицы с помощью потоков и узнать время работы. Я могу это сделать через Thread в...

13
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.05.2022, 13:45
noz0o, что происходит в функциях func1, func2, func3?
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
11.05.2022, 14:29  [ТС]
Запись в Com-port WriteFile
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.05.2022, 14:33
noz0o, данных вы дали недостаточно. Чтобы назвать точную причину, надо смотреть код. Пока лишь можно сказать, что если ваша программа виснет, значит вы ее так написали. Никаких внешних причин, зависящих от железа или ОС в данном случае скорее всего нет.
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
11.05.2022, 16:02  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (Ch1)
    { 
        
        //Hex1ChLoadThread = AfxBeginThread(LoadHex1Ch, DLG, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);  
        //Hex1ChLoadThread->ResumeThread( );
 
        vector_thread.push_back(thread(LoadHex1Ch, DLG));
    }
 
if (Ch2)
    {
 
        //Hex2ChLoadThread = AfxBeginThread(LoadHex2Ch, DLG, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);  
        //Hex2ChLoadThread->ResumeThread( );
 
        vector_thread.push_back(thread(LoadHex2Ch, DLG));
    }




Функция на потоке:

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
UINT LoadHex1Ch(LPVOID L) 
{
    
    CString msg;
    CDialogTU *DLG = (CDialogTU*)L;
    BOOL bOpened;
 
 
    
    if(!FileExists(Path + ini.GetValue(MUP_type, "FileName_1Ch")))//проверка существования загружаемого файла
    { 
        msg.Format("Не удалось загрузить 1 канал. Файл не найден");
        DLG->m_ListMsg.AddString(msg);
        LoadHexErrA++;
        return ERROR_CODE;
    }
    ComPort1.PresetComParameters(Speed_RS, 8, NOPARITY, ONESTOPBIT,  StrToBool(ini.GetValue(MUP_type, "RTS_1Ch")), StrToBool(ini.GetValue(MUP_type, "CTS_1Ch")));
    bOpened = ComPort1.OpenCom(ini.GetValue(MUP_type, "Com_name_1Ch"));
 
    if (!bOpened)
    {
 
        msg.Format("Ошибка открытия порта "+ ini.GetValue(MUP_type, "Com_name_1Ch")+"!");        
        DLG->m_ListMsg.AddString(msg);
 
            LoadHexErrA++;
        return ERROR_CODE;
    }
 
 
    msg.Format("1Канал загрузка"); 
    DLG->m_ListMsg.AddString(msg);
 
 
 
    if (!LoadTest(&ComPort1, Path + ini.GetValue(MUP_type, "FileName_1Ch")))
    
    {
        LoadHexErrA++;
        msg.Format("1Канал не удалось загрузить hex");       
        DLG->m_ListMsg.AddString(msg);
        return RS232_TIMEOUT;
    }
    else
    { 
        msg.Format("1Канал ОК");         
        DLG->m_ListMsg.AddString(msg);
        HexLoad_1 = 1;//признак наличия  hex в модуле
        return SUCCESS_CODE;
    }
}

При AfxBeginThread программа "падает" на LoadTest

Код функции:

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
BOOL LoadTest(CComPort *ComPort, CString FileName)
{
 
    DWORD len = 0;
    CString wCommand, rCommand;
    CString msg;
    
    GetRS232Buf(ComPort, &msg);
 
    wCommand.Format("L");
    // выдать команду
    if (!ComPort->WriteBlock((LPBYTE)wCommand.GetBuffer(wCommand.GetLength()), wCommand.GetLength()))
 
    {
        return FALSE;
    }
    Sleep(100);
    // получить ответ
    len = GetCommand(ComPort, 'L', &rCommand);
    if (len == 0) return FALSE;
 
    if (LoadHexFile(ComPort, FileName)) return FALSE;
 
    GetRS232Buf(ComPort, &msg);
 
    wCommand.Format("R");
    // выдать команду
    if (!ComPort->WriteBlock((LPBYTE)wCommand.GetBuffer(wCommand.GetLength()), wCommand.GetLength()))
    {
        return FALSE;
    }
    Sleep(10);
 
 
    return TRUE;
 
}

И функция непосредственно загрузки файла:

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
BOOL LoadHexFile(CComPort *ComPort, CString FileName)
{
    char *HexDataBuf = NULL;     
    unsigned HexDataBufLen;      
    DWORD ErrCde = 0;
 
    CFile File;
 
    if(File.Open(FileName, CFile::modeRead | CFile::shareDenyNone /*| CFile::typeBinary*/))
    {
        HexDataBufLen = File.GetLength();       // длина файла
        char *HexDataBuf = new char[HexDataBufLen];
        File.Read(HexDataBuf, HexDataBufLen);
        File.Close();
 
        for (unsigned int i = 0; i < HexDataBufLen; i++)
        {
 
            if (!ComPort->PutByte(HexDataBuf[i]))
            {
                ErrCde = LOAD_ERROR;
                break;
            }
        } 
 
        delete []HexDataBuf;
    }
    else ErrCde = READ_ERROR;
 
    return ErrCde;
    
}
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.05.2022, 17:53
noz0o, из того, что вы предоставили, сейчас видно только одну серьезную проблему: прямое обращение к GUI из рабочего потока. Так делать нельзя. Нужно использовать PostMessage, чтобы поставить в очередь GUI сообщение о необходимости изменения.
1
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
11.05.2022, 18:35
Цитата Сообщение от noz0o Посмотреть сообщение
В чем может быть проблема и как ее "лечить"?
Полагаю, что "Эта группа процессов UWP используется для приостановки процессов в целях повышения производительности системы" не имеет отношения к проблеме. Не точно, но вроде это система пытается так разгрузить процессор путём приостановки части запущенных фоновых приложений.

Проблема же в том, что ваша программа сильно грузит процессор. Из-за этого и происходят тормоза в остальных приложениях. Нужно что-то менять в программе.

Потоки запущенные через AfxBeginThread у вас не работают, так что сравнивать загрузку с ними не имеет смысла. Загрузка в 60 процентов - это не много и вроде не должно сильно тормозить, если ещё какие-нибудь программы не запущены. Возможны разные причины тормозов.

У процессоров есть реальные ядра и мнимые (hyper-threading). Нормальную спецификацию на ваш процессор в инете не вижу, санкции не пускают. Если гипертрединг поддерживается и включён в биосе, то количество логических ядер в системе удваивается. При включённом гипертрединге показания нагрузки процессоров в диспетчере задач не соответствуют действительности. При видимой загрузке в 80 процентов реальной мощи уже легко может не хватать.

Другой вариант, узкое место не процессор, а память. Если диспетчер задач показывает суммарную загрузку памяти близкую к имеющейся физической памяти, то могут возникать проблемы со свопом. Если начинается своп, то производительность сильно падает. При этом, наверное, диск должен активно "шуршать". Хотя, если память свопится на SSD-диски, то может быть и не слышно ничего.
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
11.05.2022, 19:06  [ТС]
Это и является источником проблемы из сабжа?

Добавлено через 7 минут
При AfxBeginThread загрузка 60%, в диспетчере 1 задача в обоих случаях
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
11.05.2022, 19:29
Цитата Сообщение от noz0o Посмотреть сообщение
Это и является источником проблемы из сабжа?
Это же логично, что вся система тормозит потому что вы сильно нагрузили процессор.

При AfxBeginThread загрузка 60%, в диспетчере 1 задача в обоих случаях
Я не понимаю, что вы хотите этим сказать, поясните.
Ранее вы говорили, что AfxBeginThread не работает.
Потом вы говорили, что при AfxBeginThread 18%, а при std::thread 60%.
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
11.05.2022, 19:38  [ТС]
AfxBeginThread не работает корректно, если запускать через .exe, при компиляции в IDE все отрабатывает без зависаний и тп.
AfxBeginThread 60%, а std::thread 18%. При запуске с последним ОС теряет отзывчивость как в IDE, так и в .exe
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.05.2022, 19:41
noz0o, временно уберите любые обращения к GUI из всех ваших рабочих потоков. Запустите программу и посмотрите что изменилось в загрузке процессора.
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
12.05.2022, 08:35  [ТС]
Убрал любые обращения к GUI, ситуация не изменилась. std::thread::hardware_concurrency() возвращает 4.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.05.2022, 09:51
Цитата Сообщение от noz0o Посмотреть сообщение
Убрал любые обращения к GUI, ситуация не изменилась.
Ну по идее дальше нужно очень плотно ваш код смотреть.
1) Убедиться в отсутствии гонок. Все общие ресурсы должны быть синхронизированы;
2) Убедиться в отсутствии циклов и рекурсий без передачи времени системе;
3) Убедиться, что вы точно больше нигде не работаете с GUI из рабочих потоков напрямую.
И т.д.
По обрывкам кода вам сложно помочь.
Попробуйте запустить под профилировщиком и посмотреть в каком месте программы большая часть времени проходит. Можно будет сильно сузить радиус поиска.

https://docs.microsoft.com/en-... ew=vs-2022
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
12.05.2022, 12:53  [ТС]
Проблема решена. Оказалась неисправность графического процессора, грузился до 100%. На встроенном все работает без нареканий. Всех благодарю за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2022, 12:53
Помогаю со студенческими работами здесь

Работа с потоками. На некоторых ПК один из потоков, в момент работы приложения, не просыпается
Вообщем обнаружилась такая проблема: есть приложение на С#, FW 4.0. При старте создается несколько потоков, после чего они...

Определить время работы приложения
помогите пожалуйста вывести время программы за которое оно работает #include &lt;stdio.h&gt; #include &lt;string.h&gt; int...

Блокировка ip во время работы приложения
Здравствуйте, подскажите как можно сделать чтобы при запуске программы блокировался ip например 145.345.8.9?

Ошибка во время работы приложения
Доброго времени суток. Во время работы приложения вылетает такая ошибка. Пробовал переустановить - не помогает. Microsoft .NET Framework...

Повышение прав приложения во время работы
Имеется проект графической программы. Этой программе необходимо во время работы повышать права до суперпользователя. Во время работы...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru