2009-06-10 3 views
2

ich eine C# .NET-Anwendung zu schreiben, die eine C++ DLL aufruft. Diese DLL ist ein Gerätetreiber für ein Abbildungssystem; Wenn das Bild aufgenommen wird, ist eine Vorschau des Bildes zeilenweise aus der Bibliothek verfügbar. Die C++ - DLL nimmt einen Rückruf, um die Vorschau auszufüllen, und dieser Rückruf besteht im Wesentlichen aus der Größe des endgültigen Bildes, der aktuell gescannten Zeile und der Datenzeile selbst.C# app C++ dll zurück in die C# app über Rückrufe

Problem ist, gibt es aus der Zeit eine ziemlich ernste Verzögerung ist, wenn stoppt das Scannen und der C# Rückruf nicht mehr Informationen zu bekommen. Der Ablauf des Programms geht in etwa so:

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

Das gleiche DLL arbeitete mit einer C++ - Anwendung ganz gut; es scheint nicht die letzte Schrittverzögerung zu sein. In C# jedoch, wenn ich den Rückruf sofort zurückgeben, ist die Verzögerung noch vorhanden; egal, was ich im Callback mache, 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 dies schneller gehen zu machen? Ich bin in Kontakt mit der C++ - Bibliothek Writer, so ist es möglich, eine Fehlerbehebung von der C++ Seite zu implementieren.

Edit: Könnte etwas so einfach wie eine Named Pipe Arbeit tun? Kann eine Anwendung von ihrer eigenen Pipe lesen?

+0

So klingt es wie der Rückruf viele Male pro Bild aufgerufen wird? Wie viele? Vielleicht können Sie diese Aufrufe in einem einzigen Callback Batch, indem die C++ DLL die Daten zwischenspeichern? –

+0

Maybe-- wie in der C++ - DLL deklariert den Puffer, übergibt den Zeiger an die C# -App, und dann die App regelmäßig aus dem Puffer verbraucht? – mmr

Antwort

0

Es stellt sich heraus, dass die Verzögerung in der C++ - Seite ist, von einem Entwickler, der es hoch und runter schwor, war es nicht.

0

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

Siehe PSA: Pinvokes may be 100x slower under the debugger Blog-Eintrag von Mike Stall.

+0

Ich bin in einer Release-Konfiguration ausgeführt, die die Haupt-App und alle Bibliotheken mit DEBUG deaktiviert, TRACE deaktiviert und Optimieren aktiviert hat. Also, nach der Eigenschaftsseite für jede Lösung, nein, ich bin nicht im Debuggen. Das ist auch vs2008, wäre das wichtig? – mmr

+0

Ich renne auch durch einen Doppelklick auf die ausführbare Datei, anstatt den hilfreichen grünen Pfeil in vs2008 zu verwenden. – mmr

+0

Wenn Sie mit dem C++ - Entwickler arbeiten können, prüfen Sie, ob Sie das Debugging im gemischten Modus aktivieren und das Problem aufspüren können. –

0

Tun Sie flippige Daten über die Interop-Schicht Rangier? Wenn dies der Fall ist, haben Sie möglicherweise eine große Verzögerung, während es im Grunde alle Ihre Bilddaten durch Konvertierung es umstellt. Sie können dies leicht testen, wie die großen Bilddaten sind, desto länger dauert es, bis

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

Hoffnung, die

hilft