2010-11-30 5 views
6

Guten Tag,Multi-Threading-Zugriff auf MapPoint?

Wie ich bereits in einem anderen Beitrag gesagt habe, muss ich einige 8.000.000 kürzeste Zeit/Weg-Abstände zwischen einigen Punkten in der Karte berechnen, deren Koordinaten bekannt sind. Das Problem ist, dass, während geradlinige Entfernungen einfach (und schnell) berechnet werden können, mir jemand gesagt hat, dass eine Single-Thread-Anwendung Probleme haben kann, diese Anzahl von Entfernungen mit MapPoint zu berechnen. Die Frage ist, dass ich weiß nichts über Multithreading ... ich zur Zeit auf einem i7 arbeite - 720QM Umgebung, so würde Ich mag alle 4 Kerne verwenden, um diese Berechnungen zu machen ... Gibt es eine einfache Möglichkeit, dies zu tun in C# oder C++?

Vielen Dank.

Antwort

3

Wenn Sie völlig neu in die Multithreading als mein Rat mit Backgroundworker-Komponente als Ausgangspunkt beginnen und allmählich zu mehr garnular Threading Konzepten wechseln.

und wenn Sie mit ..net 4.0 als Task Parallel Library Sie einfache Möglichkeit gibt, mit zu beginnen.

Siehe Links unten

TPL

BackGroundWorker

+0

Kann ich TPL mit MapPoint verwenden? Kann ich for-Schleifen parallelisieren? – user2381422

1

dass mich gewesen wäre, der sagte, es würde lange dauern. Die COM-API von MapPoint ist single threaded. Um mehrere Routen gleichzeitig berechnen zu lassen, müssen mehrere MapPoint-Knoten gestartet werden, die jeweils einen eigenen Thread haben.

Also für Ihren Quad-Core, werden Sie 2-3 Threads beginnen. Jeder Thread startet seinen eigenen MapPoint und verwendet ihn dann zum Routen. Sie haben KEINE MapPoint pro Kern. Neben OS-Overhead und Ihr E/A-Overhead, wenn Sie eine einzelne MapPoint berechnet eine Route beobachten, werden Sie feststellen, dass spätere Versionen teilweise intern Multi-Threaded und kann etwa 1,5 Kern nehmen, wenn sie verfügbar sind.

Darüber hinaus gibt es viele Fallstricke zu achten. Die eigene Speicherbereinigung von MapPoint ist nicht für die Berechnung von Batchrouten optimiert. Die einfachste Problemumgehung dafür besteht darin, jede MapPoint-Anwendung in regelmäßigen Abständen neu zu starten (mindestens einmal am Tag, aber wahrscheinlich häufiger).

Auch einige Operationen (File Open scheint die Hauptfunktion zu sein) können nicht von mehreren MapPoints gleichzeitig aufgerufen werden. Wahrscheinlich, weil sie versuchen, die gleiche Datei zu öffnen, aber ich habe nicht weiter untersucht. Sie müssen Ihren eigenen Sperrmechanismus implementieren, um dies zu vermeiden.

Saurabh Rat für .NET 4 klingt gut: Ich habe noch .NET 4 Multi-Threading in Wut verwenden - mein MapPoint/.NET Threading Erfahrung mit .NET 2.

Ich weiß nicht, was Ihre App ist, aber wussten Sie, dass ich ein Produkt verkaufe, das Multi-Prozessor MapPoint für Batch-Route Entfernung/Zeit Berechnung verwendet ... :-)

+0

Sie haben gesagt, MapPoint ist single-threaded. Aber Saurabh sagte, ich könnte TPL benutzen. Wer ist also hier? – user2381422

+0

Versuchen Sie es: Beachten Sie, dass Saurabh nicht explizit sagt, dass er es mit MapPoint verwendet hat. Meine Erfahrung mit MapPoint Multithreading (sowohl C# als auch Python) ist, dass es sehr grob sein muss (dh auf App-Ebene), und selbst dann müssen Sie bestimmte Funktionen sperren. – winwaed