У меня на CComboBox есть значок CDialog со списком имен файлов.
Папка, в которой находятся файлы, иногда обновляется. А это значит:
Какой лучший способ справиться с этим?
OnKickIdle.OnDropDown?Спасибо за руководство. Меня беспокоит влияние на производительность приложения.
@IInspectable Я раньше этим не пользовался, но, на первый взгляд, он говорит, что позволяет пользователю автоматически заполнять набираемый текст. Я хочу обновить параметры раскрывающегося списка комбо. Я что-то пропустил?
Его можно настроить для работы как раскрывающийся список.
Просто выберите событие раскрывающегося списка и заполните список, когда это необходимо.





Что ж, у каждого решения есть свои плюсы и минусы. Мои мысли:
Я бы не стал использовать OnKickIdle(), так как это довольно «расточительно»; это событие действительно запускается «все время», даже в результате движения мыши, наведения курсора, нажатия клавиши и т. д. Добавьте команду Beep(1000,30) в OnKickIdle(), чтобы проверить, сколько раз она вызывается, и спросите себя, хотите ли вы, чтобы ваша приложение так часто сканирует каталог. И вы можете запустить обновление, даже если раскрывающийся список расширен. Вместо этого вы можете использовать какой-нибудь таймер, но это всего лишь старый добрый метод «Опроса».
Сканирование папки в OnDropDown() имеет очевидный недостаток: выполнение относительно дорогостоящей операции в тот самый момент, когда пользователь ожидает ответа пользовательского интерфейса. Однако если папка находится на SSD той же машины и количество файлов невелико, время отклика может быть абсолютно приемлемым. Может быть другая история, если количество файлов велико и/или папка находится на сетевом томе.
Если вы готовы приложить к этому немного больше усилий, вы можете рассмотреть Уведомления об изменении каталога. Его можно реализовать в отдельном потоке, что сделает процедуру обновления незаметной для пользователя.
Обновлено:
В документации упоминается, что дескрипторы, возвращаемые функциями уведомления FindFirst/FindNext, необходимо ожидать с помощью функций ожидания. То есть вызывающий поток будет заблокирован до тех пор, пока не будет получено уведомление (содержимое каталога/файлов или атрибуты не изменены) или не истечет таймаут (если в функции ожидания использовался таймаут, отличный от INFINITE). Конечно, вы не хотите, чтобы ваш поток пользовательского интерфейса был заблокирован, поэтому лучшая конфигурация — отдельный рабочий поток (для ожидания уведомлений).
Альтернативой может быть использование функции MsgWaitForMultipleObjects() вместе с пользовательским циклом сообщений, чтобы можно было обрабатывать сообщения пользовательского интерфейса. Я считаю, что это намного сложнее и сложнее, поскольку вам придется вмешиваться в стандартную обработку сообщений MFC. Создать новую тему гораздо проще и понятнее.
Изменения, вносимые в файлы в папке, скорее всего, будут нечастыми, и я думал, что там может быть максимум 10 или 20 файлов. Ничего огромного. Вы подтвердили мои подозрения насчет OnKickIdle, поэтому я пока выберу OnDropDown. Я посмотрю уведомления об изменении каталога и /, когда почувствую, что это необходимо. 🙏
@AndrewTruckle, я обновил пост. Извините за задержку.
Привет, Вы могли бы рассмотреть возможность использования файловой системы, а не поле со списком. Возможно, операция также потребует синхронизации. Я заметил в Интернете функцию: API
Вместо этого вы можете подключить интерфейс IAutoComplete, и система сделает всю работу за вас. Раскрывающийся список заполняется по требованию.