Delphi - Как прослушивать и обрабатывать сообщения WMDeviceChange во время выполнения задачи? - PullRequest
0 голосов
/ 15 марта 2009

Я столкнулся с проблемой, что два диска, подключенные почти одновременно, не могут быть обработаны. Я на самом деле исправил старый способ получения модели привода, но у меня такое ощущение, что я собираюсь столкнуться с той же проблемой.

Похоже, что если выполняется задача, такая как та, которую я проверяю, является ли накопитель определенным устройством, и, к сожалению, требуется немного времени, если устройство только что было подключено. Что дальнейшие сообщения WM_DEVICECHANGE, выданные во время его выполнения, вообще не принимаются.

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

У меня есть обработчик WM_DEVICECHANGE, который прослушивает прибытие устройства и удаление устройства. Он получает и возвращает букву диска и передает ее в код, который добавляет диск в поле со списком, затем проверяет, является ли он psp или просто съемным диском, а затем выводит диалоговое окно с сообщением пользователю, хотят ли они выбрать этот диск или нет.

У меня также есть ощущение, что диалог сообщений будет препятствовать обработке сообщений WM_DEVICECHANGE, но пока я не напишу новые методы, я не могу проверить это.

В любом случае, я подумал, что, может быть, кто-то может понять, что я имею в виду, и указать мне правильное направление. Я беспокоюсь, беспокоюсь, что попытка использовать потоки вызовет их собственную небольшую группу проблем?

1 Ответ

2 голосов
/ 15 марта 2009

Я бы не использовал темы для этого. Просто возьмите ответы, которые вам дали на ваши другие вопросы, и создайте более общее решение из этого.

Если вы останетесь с одним потоком GUI, вы не пропустите сообщения - вы просто обработаете их с небольшой задержкой. Однако чего вы не можете делать, так это игнорировать дальнейшие сообщения во время обработки одного и вызывать Application.ProcessMessages () или задействовать таймер - это то, с чем вы сталкиваетесь в данный момент.

Пока модальный диалог активен, у вас работает вторичный цикл обработки сообщений, и новые сообщения WM_DEVICECHANGE могут быть получены, пока вы обрабатываете предыдущее. Что бы я сделал, чтобы справиться с этим:

  1. Создайте список ожидающих записей запросов на накопитель в вашем приложении, эта запись может, например, содержать букву диска, все необходимые дополнительные данные и значение времени для истечения срока действия запроса.

  2. Получив сообщение WM_DEVICECHANGE , вы добавляете новую запись запроса в свой список с установленной буквой диска и значением времени ожидания, равным текущему времени плюс, возможно, тридцать секунд. Каждая буква диска должна быть только один раз в списке. Бонусные баллы за удаление запросов при немедленном удалении диска. Вам также необходимо включить таймер.

  3. В обработчике событий таймера вы сначала отключаете таймер, а затем выполняете свой код для обработки запроса. Если это удастся, вы удалите запрос из списка. Если это не удалось, но текущее время прошло после запроса на тайм-аут, вы удалите запрос из списка, предупреждая пользователя о наличии проблемы. Если до истечения времени ожидания осталось время, оставьте запрос в списке, чтобы повторить попытку в следующий раз. Наконец, вы снова активируете таймер, но только если список запросов не пуст.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...