Если бы это было позже, я бы сказал, используйте API-интерфейсы для асинхронных агентов (подключите для того, над чем я работаю) в , который еще не выпущен Visual Studio 2010 , однако, что я бы сказал, учитывая Сегодняшние инструменты - это разделение работы, в частности, в своем насосе для передачи сообщений вы хотите сделать как можно меньше работы, чтобы идентифицировать сообщение и передать его другому потоку, который будет обрабатывать работу (надеюсь, что нет информации о локальной потоке, которая требуется). Передача его другому потоку означает вставку его в потокобезопасную очередь какого-либо вида, либо заблокированную, либо без блокировки, а затем задает событие, которое другие потоки могут наблюдать, чтобы извлечь элементы из очереди (или просто извлечь их напрямую). Для большей эффективности вы можете использовать «очередь на кражу работы» с пулом потоков.
Это завершит получение работы из потока пользовательского интерфейса, чтобы поток пользовательского интерфейса мог выполнять дополнительную работу (например, рисование результатов этой работы), вам необходимо сгенерировать сообщение Windows, чтобы пробудить поток пользовательского интерфейса и проверить результаты, Самый простой способ сделать это - иметь другую очередь «готовых к работе» рабочих объектов для выполнения в потоке пользовательского интерфейса. представьте себе очередь, которая выглядит следующим образом: threadsafe_queue<function<void(void)>
в основном вы можете проверить, является ли она непустой в потоке пользовательского интерфейса, и если есть рабочие элементы, то вы можете выполнить их встроенными. Вам нужно, чтобы рабочие объекты были как можно более короткими, и желательно, чтобы они вообще не блокировали .
Еще один метод, который может помочь, если вы все еще видите реакцию на резкое движение, - это либо убедиться, что обратный вызов потока не выполняется дольше 16 мс, и что вы не берете никаких блокировок или не выполняете какой-либо ввод-вывод. в потоке пользовательского интерфейса. Существует ряд инструментов, которые могут помочь идентифицировать эти операции, наиболее свободно доступным является 'инструментарий производительности Windows' .