|
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
|
|||||||||||
Работа с потоками21.07.2018, 10:04. Показов 1579. Ответов 6
Метки нет (Все метки)
Всем здравствуйте.
Программа обращается к некоторому файлу по локальной сети на удалённом компьютере. Из этого файла в программу считывается информация в виде массива байтов (массива структур). Если сетевой путь указан несуществующий (старая конфигурация, отключена сеть), то это обращение может занять несколько секунд и только потом появится сообщение системы или разработчика о ошибочном пути к сетевому файлу. (Не понимаю зачем разработчики всех Windows это сделали для локальной сети, а не только для интернета.) На лицо имеем нежелательные тормоза всего приложения. А если это обращение будет производится ещё и в цикле таймера, тормоза основной программы будут особо ярко выражены. Кликните здесь для просмотра всего текста
Возникла идея вынести обращение к некоторому файлу по локальной сети в отдельный поток, пусть уж в случае отсутствия сетевого соединения тормозится не вся программа, а только он. Кликните здесь для просмотра всего текста
Вопросы: Как приостановить и возобновить поток (клик по Button из основной программы)? Как уменьшить его частоту (Pause) чтобы не так сильно грузить процессор? Где в представленном коде вывести сообщение о не существовании указанного сетевого пути? Что в предложенном коде лишнее?
0
|
|||||||||||
| 21.07.2018, 10:04 | |
|
Ответы с готовыми решениями:
6
Работа с потоками Работа с потоками
|
|
8 / 8 / 2
Регистрация: 02.10.2014
Сообщений: 112
|
|
| 22.07.2018, 11:14 | |
|
Если не заморачиваться:
Остановка thread->Suspend() Запуск thread->Resume() Воткните в ваш while (и никогда не делайте впредь подобные циклы без разгрузки) в любом месте Sleep(1); У вас же есть Synchronize(ShowData); воткните аналог для показа ошибки пути. Или выйдите из цикла и по завершению потока покажите ошибку, ну или не покажите, если путь есть P.S. к слову, ваш поминутный Synchronize(ShowData); сводит на нет мороку с выносом загрузки в поток, и добавляет проблем с нагрузкой - порциями хоть выводите как то
1
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
||||||
| 23.07.2018, 08:35 | ||||||
|
А просто проверка по таймеру на существование файла не может решить проблему?
Добавлено через 3 минуты П.С. хотя нет, - при несуществующем пути всё равно тормозит.
1
|
||||||
|
8 / 8 / 2
Регистрация: 02.10.2014
Сообщений: 112
|
||||||
| 23.07.2018, 12:44 | ||||||
|
в старые добрые времена, когда ассемблер был молодым..) одним словом, напишите подобный костылище, засуньте его в поток и все
1
|
||||||
|
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
|
|||||||
| 28.07.2018, 12:38 [ТС] | |||||||
|
Meoww, я сделал так:
Кликните здесь для просмотра всего текста
Ошибок не вижу. Кнопка 2 присваивает переменной sFName несуществующее сетевое имя, кнопка 1 присваивает переменной sFName существующее сетевое имя, ничего не тормозит. Частота проверочного Timer2 = 1000 мсек
0
|
|||||||
|
8 / 8 / 2
Регистрация: 02.10.2014
Сообщений: 112
|
|
| 28.07.2018, 12:44 | |
Сообщение было отмечено jkrnd как решение
Решение
Я вам в примере показал как можно обойтись без (от слова совсем) reader->Suspend(); и reader->Resume(); и не морочить себе голову (вы завели себе поток, неее маловато будет, надо еще таймер к этому потоку прикрутить)))).
Запустили поток один раз и пусть себе крутится до окончания программы. Что же до Synchronize(ShowData) - в вашем случае да - это некритично. Но в случае частого обращения из потока к форме, эта конструкция может не кисло тормозить (конечно в зависимости от начинки ShowData). Не вдаваясь в подробности, считайте что каждый Synchronize(ShowData) - то же самое, что подобный код в таймере в главном потоке.
1
|
|
|
156 / 114 / 36
Регистрация: 27.06.2018
Сообщений: 257
|
||
| 28.07.2018, 13:35 | ||
Дело в том, что поток может быть заморожен даже в тот момент, когда выполняется Synchronize. "Заморозку" можно использовать для отладки, а не для релиза.
1
|
||
| 28.07.2018, 13:35 | |
|
Помогаю со студенческими работами здесь
7
Работа с потоками Работа с потоками через OpenDialog Работа с потоками и процессами windows
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|