Laden...

C# und C++ Callback

Erstellt von King vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.494 Views
K
King Themenstarter:in
27 Beiträge seit 2006
vor 15 Jahren
C# und C++ Callback

Hallo Leute!!

Ich habe folgendes Problem:

Ich spiele decodierte ogg-Dateien über WaveOut ab. Dabei verwende ich einen C++ Wrapper. Das funktioniert auch sehr gut und ohne jegliche Probleme. Weiters habe ich eine WPF oberfläche. Wenn ich nach einer gewissen zeit z.B. 5 sek. die GUI mit hilfe eines Callback informieren möchte das 5 sekunden abgespielt wurden, wird die C++ Callback methode richtig aufgerufen. In C# fange ich die Information über einen Listner ab. Das alles funktioniert super nur leider bekomme ich immer die Information mit einer Zeitversetzung von ca 300 milisekunden.

Ich habe auch einen Log eingebaut welcher mit registiert wann sie callback in c++ aufgerufen werden sollte und wann die information in C# einlangt. und die Zeitdiffernez ist eben 300 milisekunden.

Einfach erklärt in C++ wird alles richtig aufgerufen aber C# reagiert immer mit einer Zeitversetzung von 300 milisekunden, was mich stört. Gibt es da eine moglichkeit die reaktionszeit zu verbessern, also so das die information schneller von C# abgefangen wird (denn C++ macht alles fehlerfrei)?

Ich bin euch für jede hilfe dankbar.

1.130 Beiträge seit 2007
vor 15 Jahren

In C# fange ich die Information über einen Listner ab.

Was meinst du mit listener?
Du kannst doch einen c funktionszeiger zu einem C# delegaten erstellen lassen.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

K
King Themenstarter:in
27 Beiträge seit 2006
vor 15 Jahren

Also ich habe es wie folgt gemeint:

in der DLL Wrapper Klasse (c++) verwende ich folgende funktion:


// setzt eine callback funktion, die immer dann aufgerufen wird, wenn ein sample fertig geworden ist
void WaveOut::setCallback(void (*callback)(bool))
{
	funcPtr = callback;
}

Erklärung siehe Kommentar.

Als nächstest deklariere ich die C++ schnittselle in meiner C# Klasse


 // setzt eine callback funktion, die immer dann aufgerufen wird, wenn ein sample fertig geworden ist
        [DllImport("WaveOut.dll", EntryPoint = "setCallback", CharSet = CharSet.Unicode,
             CallingConvention = CallingConvention.Cdecl)]
        private static unsafe extern int waveOutSetCallback(int id, CallBack callBack);

Im Konstruktor der C# klasse wird die oben deklarierte funtkion verwendet/gesetzt:


...
 mCBack = new CallBack(sampleFinished);
 setCallback(mCBack);
...

jetzt noch die setCallback funktion welche vom c# Konstruktor aufgerufen wird (greift auf DLL zu):


 // setzt eine callback funktion, die immer dann aufgerufen wird, wenn ein Sample fertig geworden ist
        private int setCallback(CallBack callBack)
        {
            return waveOutSetCallback(id, callBack);
        }

und zu guter letzt meine sample finished funktion:


 // callback funktion, die vom waveOut device aufgerufen wird
        private void sampleFinished(bool single)
        {
            TimeSpan duration = DateTime.Now - start;
            Console.WriteLine("got callback after: " + duration.TotalMilliseconds);
        }

So und das Problem ist jetzt das wenn ich in c++ die callback aufgerufen wird die C# Klasse erst mit einem Zeitvergug von mindestens 300 millisekunden reagiert. Und meine Frage ist ob ich das Anders lösen kann damit C# schneller reagiert. P.S: Wenn C++ die Callback aufruft reagiert diese auch sofort (habe ich mit einem Log getestet) nur C# braucht länger.

Weiters verwende ich dann noch einen Listener welcher die Zeit in der GUI setzen soll, was aber nur mit zeitvergug geht weil c# zu lange braucht.

p.s. Danke für eure Tipps und eure Hilfe.

1.130 Beiträge seit 2007
vor 15 Jahren

Probier mal mit ner Stopwatch (wrapperklasse für performancecounter) die Zeit zu messen, da Datetime nicht sehr genau und langasem ist. Der Effekt sollte sich aber maximal 16ms Aufruf betragen.
Außerdem dauert der erste Aufruf einer Methode in c# deutlich länger als die folgenden. Dieser Effekt sollte aber ebenfalls 20 Millisekunden nicht überschreiten.
Ich bin da auch ratlos. Ein kurtzer Test zeigt bei mir erst 29, dann 0ms Zeit zum Aufrufen eines Funktionszeigers für einen Delegaten.

[EDIT]
Wei oft wird denn der Callback aufgerufen?
Hast du irgendeinen Debugger laufen?

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

K
King Themenstarter:in
27 Beiträge seit 2006
vor 15 Jahren

Danke fuer deine Hilfe. Ich habe das Problem letztendlich anders geloest ich verwende keine Callbacks mehr sondern ueberpruefe immer die Aktuelle Position im Soundfile mittels einem Thread und bekomme somit keinen Zeitverzug mehr.