Frage

Ich schreibe eine C # Anwendung, die eine C ++ DLL aufruft. Diese DLL ist ein Gerätetreiber für ein Abbildungssystem; wenn das Bild aufgenommen wird, wird eine Vorschau des Bildes aus der Bibliothek auf einer Zeile-für-Zeile-Basis zur Verfügung. Die C ++ DLL nimmt einen Rückruf in der Vorschau zu füllen, und das Rückruf besteht im wesentlichen aus der Größe des endgültigen Bildes, das aktuell bearbeitete Linie und die Linie der Daten selbst.

Das Problem ist, gibt es eine ziemlich ernste Verzögerung von dem Zeitpunkt, stoppt das Scannen und der C # Rückruf nicht mehr den Zugriff auf Informationen. Der Ablauf des Programms geht in etwa so:

  1. Weisen Rückruf C ++ DLL aus C #
  2. Benutzer beginnt, Daten zu erhalten
  3. Gerät startet
  4. dll startet den Rückruf nach wenigen Sekunden (normal)
  5. anrufen
  6. Gerät beendet die Bilderzeugung
  7. dll Aufruf wird noch den Rückruf für die doppelte Zeit der Bilderzeugung.

Das gleiche DLL arbeitete mit einer C ++ Anwendung ganz gut; es scheint nicht, dass letzte Schritt Verzögerung zu sein. In C #, aber wenn ich den Rückruf sofort zurückkommen muß, besteht die Verzögerung immer noch; egal, was ich in dem Rückruf zu tun, es ist da.

Ist diese Verzögerung eine inhärente Begrenzung der verwalteten Code von nicht verwalteten Code aufrufen, oder gibt es etwas zu beiden Seiten tun könnte, um diese schneller gehen? Ich bin in Kontakt mit der C ++ Bibliothek Schriftstellern, so ist es möglich, ein Update von der C ++ Seite zu implementieren.

Edit: Könnte etwas Einfaches wie eine Named Pipe Arbeit tun? Könnte eine Anwendung aus dem eigenen Rohr lesen?

War es hilfreich?

Lösung 3

Es stellt sich heraus die Verzögerung ist in der C ++ Seite, von einem Entwickler, der schwor, nach oben und unten war es nicht.

Andere Tipps

Es kann möglich sein, dass der Managed Debug-Assistent, die native Rückrufe für Müll gesammelt Ziele Prüfungen kann die Ursache sein (es ist im Debug-Modus unter dem Debugger?)

Sehen Sie die PSA rel="nofollow: Pinvokes unter der 100x langsamer sein kann Debugger Blog-Eintrag von Mike Stall.

Tun Sie flippige Daten über die Interop-Schicht Rangier? Wenn ja, dann können Sie eine große Verzögerung haben, während es im Grunde ist Rangier alle Bilddaten durch Umwandlung. Sie können dies einfach testen, wie die großen, die Bilddaten, desto länger wird es dauern

Einige möglichen Alternativen, die in dem Sinne sind
1.Verwenden eine Memory-Mapped-Datei benötigen Sie allerdings würde eine einfache Semaphore zu implementieren oder Signalisierungssystem zu sagen: ‚Ich habe Daten bereit‘ und ‚Ich habe die Daten
verbraucht 2. Kompilieren der C ++ dll im gemischten Modus (alle C ++ Code kann mit dem / CLR-Flag in .NET kompiliert werden) dann mit C # / CLI
3. Verwenden Sie Remoting- und IPC-Kanäle - vielleicht ein bisschen zuviel des Guten, aber einen Blick wert

Ich hoffe, das hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top