У меня есть библиотека C ++ ( Win32 Console), где я реализовал асинхронную функцию с использованием таймера. Асинхронный метод возвращает информацию об устройстве.
Я создал отдельный поток, «Поток таймера», для создания скрытого окна, а затем я вызываю SetTimer()
и затем реализованный цикл обработки сообщений.
Когда таймер истекает, он активирует обратный вызов.
Когда я использую библиотеку в консольном приложении, она работает нормально.
В приложении MFC я делаю почтовое сообщение, чтобы обновить пользовательский интерфейс при срабатывании обратного вызова. Сообщение не работает.
Если я удаляю цикл сообщений в библиотеке, он прекрасно работает в приложении MFC.
Я пришел к выводу, что:
Я полагаю, что проблема связана с двумя циклами сообщений, одним MFC (основной поток) и циклом сообщений TimerThread. Таким образом, когда вызывается обратный вызов и последующее PostMessage
приводит к циклу сообщений TimerThread и не сообщается в цикле сообщений MFC (основной поток).
Если я удаляю цикл сообщений TimerThread, он отлично работает в приложении MFC, но не работает в консольном приложении.
Как мне преодолеть эту проблему?
class IDeviceEnumerationCallback
{
public:
virtual void onDeviceDiscovered(DeviceInfo* pDeviceInfo,unsigned short nNoOfDevice) = 0;
};
class IDeviceDiscovery
{
public:
virtual int InitialiseDiscovery(IDeviceEnumerationCallback*) = 0;
virtual void UnInitialiseDiscovery() = 0;
virtual int EnumerateDevice() = 0;
};
class CDeviceDiscovery:IDeviceDiscovery
{
//Implementation
}
В приложении MFC / console я реализую IDeviceEnumerationCallback
для получения обратного вызова.
Я использую Bonjour API для перечисления устройства, и все методы в Bonjour API являются обратными вызовами.
Я ожидаю некоторого интервала времени для перечисления устройства с использованием Bonjour API, а затем через 400 мс я звоню в функцию обратного вызова для возврата результата. В приложении MFC при вызове обратного вызова я делаю PostMessage()
для обновления пользовательского интерфейса.
Раньше я пробовал без Windows сообщение сообщений. У меня была функция SetTimer
, и она работает с приложением MFC, но для консольного приложения обратный вызов никогда не вызывается, поэтому я реализовал здесь обработчик сообщений. Теперь это не работает для приложения MFC.