Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 18.12.2022
Сообщений: 3

Как использовать потоки в современном C++ в приложении на основе цикла событий?

12.10.2023, 11:04. Показов 1247. Ответов 6

Студворк — интернет-сервис помощи студентам
Я пишу интерактивное GUI приложение. Мне понадобилось выполнить длительную по времени операцию - сканирование диска. Я хочу запустить эту операцию в отдельном потоке. Часть кода для работы с диском я пишу на чистом C++, чтобы не зависеть от платформы. Я реализовал запуск сканирования в отдельном потоке с использованием std::thread и std::mutex, но очень многие, кого я просил посмотреть этот код отвечают, что использование голых потоков это не правильно и правильно мыслить категориями задач. И использовать std::future или std::async или другие подобные средства. Но я не смог найти никаких примеров использования std::future или std::async в приложениях на основе обработки событий. Во всех примерах после запуска длительного задания в главном потоке нужно вызывать wait. А я не могу останавливать главный поток, так как он должен обрабатывать события от пользователя, чтобы приложение не зависало. Мне нужно, чтобы по завершению сканирования генерировалось событие об окончании сканирования.

Можете подсказать: как использовать возможности работы с потоками в современном C++ в приложении на основе обработки событий, без вызова wait?

Мою текущую реализацию и часть советов по её улучшению можно посмотреть здесь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2023, 11:04
Ответы с готовыми решениями:

Как создать календарь событий в приложении на Android Studio?
Как создать календарь событий в приложении на Android Studio? Цель - отображать в приложении календарь событий, с возможностью их...

Как поведут себя потоки из Socket и SocketSchannel в многопоточном приложении?
Доброго дня. Подскажите пожалуйста, что будет если пересекутся запись байтов в исходящий поток (OutputStream) более чем из одного потока?...

Как правильно использовать потоки?
Доброго времени суток столкнулся со следующей проблемой не могу выполнить функцию в потоке protected string readDocuments(string...

6
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,003
12.10.2023, 11:34
Цитата Сообщение от megafanat Посмотреть сообщение
использование голых потоков это не правильно
зависит от задачи. Используй на здоровье
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
12.10.2023, 11:38
megafanat, Нужно чтобы цикл сообщений UI библиотеки поддерживал прием событий из других потоков.

В WinAPI это решается вызовом PostMessage
В Qt - через тип соединения Qt::QueuedConnection
0
фрилансер
 Аватар для Алексей1153
6444 / 5639 / 1128
Регистрация: 11.10.2019
Сообщений: 15,003
12.10.2023, 11:50
а универсально решается синхронизированым std::vector
1
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 863
12.10.2023, 12:22
Цитата Сообщение от megafanat Посмотреть сообщение
, что использование голых потоков это не правильно и правильно мыслить категориями задач
может они обяснят почему неправильно. мне,например, было бы интересно узнать как правильно мысли а как неправильно. и каким образом определяется правильность.

использование "голых потоков" не всегда удобно - ибо надо ими управлять и каждый раз писать код для управления потоками неудобно. поэтому я обычно применяю пул потоков - он давно написан, отлажен. Для более сложных случаев - систему задач - там более сложный алгоритм управления очередью заданий.

Для общений мажду потоками мне более удобны очереди - отдельный поток или потоки просто складывают туда все что хотят передать, а в другом потоке (или потоках) по мере возможностей их забирают. и никакого спейифического отношений к winapi ни к qt или к с++ это не имеет.
если в очереди ничего нету - главный поток продолжает заниматься своими делами.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.10.2023, 15:24
Цитата Сообщение от megafanat Посмотреть сообщение
...правильно мыслить категориями задач. И использовать std::future или std::async или другие подобные средства. Но я не смог найти никаких примеров использования std::future или std::async в приложениях на основе обработки событий.
Приложение на основе обработки событий - это уже система построенная в категориях задач.
Так что да, вам нужно мыслить категориями задач, но это мышление должно быть выстроено вокруг уже существующей инфраструктуры вашего GUI приложения. Если вы используете какой-то GUI фрейморк, то там уже должны быть все нужные инструменты. Т.е. проще говоря std::async абстрактно и вне контекста вам может и не подойти, потому что он скорее всего не встроен в эту инфраструктуру.

Если же вы пишете GUI приложение с нуля (например на WinAPI) и сами выстраиваете эту инфраструктуру, то используйте любые уместные средства, здесь нет и не может быть никаких запретов.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.10.2023, 16:54
Цитата Сообщение от megafanat Посмотреть сообщение
Мне нужно, чтобы по завершению сканирования генерировалось событие об окончании сканирования.
Собственно, если не лезть совсем уж в дебри, это легко осуществимо. Как я понимаю, никакие из готовых средств вы использовать не хотите (boost, Qt), но кто мешает вам самому все это сделать? Если совсем по простому-пишете свой класс, с полем типа std::function<void(bool)>, и с методом который и будет производить сканирование. По окончании сканирования вызываете этот обьект (не забыв проверить на nullptr). В конструкторе класса передаете указатель на функцию или лямбду и устанавливаете это поле. В общем, самодельный аналог сигнально/слотового соединения. Снаружи в этом обработчике проверяете результат и делаете что вам нужно. Ну и уже в нем же вызываете jion() для вашего потока (если использовали std::thread), ну или что то еще. К моменту сработки этого обработчика поток уже все сделает и завершится без задержек.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2023, 16:54
Помогаю со студенческими работами здесь

Как правильно использовать потоки?
Тему про потоки прочёл. Так же ознакомился с классом mutex. И вот есть некий вопрос: как правильно использовать синхронизацию потоков в...

Как использовать правильно потоки
У меня есть нечто рода void DiscordJob::SendMessageThread(const char *chanel, const char *pMessage) { std::thread t(() { ...

Как прописать прослушивание событий на каждый элемент цикла
Нужно повесить событие 'submit' на каждую форму под классом updateArtInfo (form1,form2...). в key находится порядковый номер записи,...

Пожалуйста, объясните как использовать потоки
Доброго времени суток. Пожалуйста объясните как работать с потоками или киньте ссылу на статью. Прочитал книгу Р.Лафоре &quot;объектно-...

Как использовать обработчики событий в битриксе?
Здравствуйте. Подскажите пожалуйста правильно ли я все делаю. Мне нужно что бы после того как пользователь заполнил вебформу и нажал кнопку...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru