Многопоточный доступ к MapPoint? - PullRequest
6 голосов
/ 30 ноября 2010

Добрый день,

Как я уже говорил ранее в другом посте, мне нужно вычислить около 8 000 000 кратчайших расстояний / расстояний между точками на карте, координаты которых известны.Проблема в том, что, хотя прямолинейные расстояния было легко (и быстро) рассчитать, кто-то сказал мне, что однопоточное приложение может иметь проблемы при расчете этого количества расстояний с помощью MapPoint.Вопрос в том, что я ничего не знаю о многопоточности ... В настоящее время я работаю в среде i7 - 720QM, поэтому я хотел бы использовать все 4 ядра для этих вычислений ... Есть ли простой способ сделать этов C # или C ++?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 30 ноября 2010

Если вы совершенно не знакомы с многопоточностью, мой совет начинайте с компонента BackGroundWorker в качестве отправной точки и постепенно переходите к более гранулярным концепциям потоков.

и если вы используете ..net 4.0, то Task Parallel Library дает вам простой способ начать с.

См. Ссылки ниже

TPL

BackgroundWorker

1 голос
/ 30 ноября 2010

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

Итак, для вашего четырехъядерного ядра вы запустите 2-3 потока.Каждый поток запускает свою собственную MapPoint, а затем использует ее для маршрутизации.У вас не будет одного MapPoint на ядро.Помимо издержек ОС и ваших операций ввода-вывода, если вы посмотрите, как один MapPoint вычисляет маршрут, вы обнаружите, что более поздние версии частично внутренне многопоточные и могут занять около 1,5 ядер, если они доступны.

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

Кроме того, некоторые операции (открытие файла кажется основной) не могут быть вызванынесколькими картами одновременно.Вероятно, потому что они пытаются открыть тот же файл, но я не исследовал дальше.Чтобы избежать этого, вам нужно будет внедрить собственный механизм блокировки.

Советы Саураба для .NET 4 звучат хорошо: мне еще предстоит использовать многопоточность .NET 4 в гневе - мой опыт многопоточности MapPoint / .NETс .NET 2.

Я не знаю, какое у вас приложение, но знаете ли вы, что я продаю продукт, который использует многопроцессорный MapPoint для расчета расстояния / времени в пакетном маршруте ...: -)

...