Laden...
K
Kaji myCSharp.de - Member
Fachinformatiker Anwendungsentwicklung Clausthal-Zellerfeld Dabei seit 10.12.2007 593 Beiträge
Benutzerbeschreibung

Forenbeiträge von Kaji Ingesamt 593 Beiträge

22.08.2008 - 20:15 Uhr

Ja stimmt schon 🙂 Ich werds mal ändern mal sehen obs einen Unterschied machen ^^

22.08.2008 - 16:55 Uhr

Hallo zommi,

hmm also ich weiß nicht was die Leute machen von dem Link den du gepostet hast aber bei mir schnurrt das WriteableBitmap so bei 8% mit anzeigen und allem bei Bildern in einer Auflösung von 1600x1200 und davon 8 Stück die Sekunde 🙂

Ich erzeuge jedesmal eine neue Writeable Bitmap Klasse ist ja auch nicht schlimm da es in der funktion erstellt wird wird es auch immer wieder zerstört. Glaube nicht das das eine Bremse ist.

Selbst wenn InteropBitmap schneller wäre, was ich gar nicht glaube..^^ Dann wäre es immer noch die performanteste WPF Bilder Klasse 🙂 ist ja ne gewrappte..^^

Gruß Daniel

Edit: Hmm wir arbeiten mit .Net 3.5 SP1 da sollte das ja sowieso gefixt haben vielleicht hat sich es daher relativiert .. 🙂

22.08.2008 - 16:34 Uhr

Hallo,

ich habe die Lösung gefunden auch wenn ich sie nicht verstehe das hier ist ja der ausgangscode:


            mvImage.prepareReadAccess();
            IntPtr mvImagePointer = mvImage.pointer;
            WriteableBitmap _wb = new WriteableBitmap(mvImage.width, mvImage.height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
            _wb.WritePixels(new Int32Rect(0, 0, mvImage.width, mvImage.height), mvImagePointer, mvImage.width * mvImage.height, mvImage.width);
            image1.Source = _wb;
            mvImagePointer = IntPtr.Zero;
            label2.Content = verarbeiteteBilder.ToString();
            label4.Content = QueueCount.ToString();
            mvImage.releaseAccess();
            mvImage.Dispose();

Bisschen abgewandelt aber vom Prinzip her und der Speicher läuft damit voll. Und jetzt wie es funktioniert:


            mvImage.prepareReadAccess();
            IntPtr mvImagePointer = mvImage.pointer;
            WriteableBitmap _wb = new WriteableBitmap(mvImage.width, mvImage.height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
            _wb.WritePixels(new Int32Rect(0, 0, mvImage.width, mvImage.height), mvImagePointer, mvImage.width * mvImage.height, mvImage.width);
            _wb.Freeze();
            image1.Source = _wb;
            mvImagePointer = IntPtr.Zero;
            label2.Content = verarbeiteteBilder.ToString();
            label4.Content = QueueCount.ToString();
            mvImage.releaseAccess();
            mvImage.Dispose();

Ja richtig nur das :

 _wb.Freeze(); 

Lässt das Programm nicht mehr den Speicher vollaufen. Ich verstehe zwar nicht warum aber damit funktioniert es wunderbar. In der MSDN mit Beispiel zu WriteableBitmap wird Freeze nicht einmal erwähnt und bei Freeze selbst steht das es das Objekt "lockt". Nur weil das Object gelockt ist kann es freigegeben werden? Hmm es ist schon fast Feierabend ich bin froh das ich die Lösung gefunden habe aber ich würde noch gerne verstehen warum 🙂

Für alle die jemals mit WriteableBitmaps arbeiten (müssen, weil es die performanteste WPF Klasse zum darstellen von Bildern sind) auf jedenfall das Bild nach bearbeiten Freezen!

Gruß Daniel

22.08.2008 - 16:15 Uhr

Das GDI32 DeleteObjects ist jetzt draußen weil es sowieo kein Sinn hatte daher ist wohl PInvoke und GetLastError hinfällig

22.08.2008 - 15:50 Uhr

Was mit noch gerade auffällt. Wenn ich alles ganz normal laufen lasse ohne Das Bild anzuzeigen also nur folgende Zeile rauskommentiere:


image1.Source = _wb;

tritt das ganze auch nicht auf. Kriegt das image Control aus WPF den Speicher nicht frei?

EDIT:
releaseAcess ist ein void als Rückgabewert.

EDIT2:
Man kann bei dem Image prüfen ob noch nach dem realease ReadAccess besteht. Besteht er nicht funktioniert also korrekt.

22.08.2008 - 15:47 Uhr

Der Pointer zeigt genau auf den Bereich des Bildes und das Bild gebe ich ja mit Dispose wieder frei ... 🙁

22.08.2008 - 15:38 Uhr

Hallo zommi,

das Image wird mit Dispose freigegeben wie gewünscht. Ich denke das der IntPtr das Problem ist. Wie kann ich den IntPtr freigeben?

22.08.2008 - 15:30 Uhr

Hallo zommi,

die queue fülle ich von einem Thread mit einem anderen nehme ich sie wieder heraus und der Leitet sie an die GUI weiter die Queue wächst nicht größer als 1 Item 🙂

1.a) Mit DeleteObject aus gdi32 wird ein IntPtr gelöscht weil er keine gemanaged resource ist und ansonsten bleiben würde.

1.b) Den Rückgabewert kann ich mal prüfen mache ich gleich.** [EDIT] In der Tat wird false zurückgegeben. Warum kann er den Pointer nicht freigeben?**

1.c) Die Reihenfolge ist korrekt. Der Zugriff auf das Image wird geschlossen. Der Pointer wird zerstört das mvImage wird Disposed vollkommen in Ordnung🙂

  1. WriteableBitmaps kommt aus WPF und implementiert kein Dispose und soll vom .Net Framework selbst geregelt werden.

Gruß Daniel

22.08.2008 - 13:56 Uhr

Hallo kleines_eichhörnchen,

ich weiß nicht welche Werte da interressant sind ich hab einfach mal CLR-Spreicher auf die Anwendung gemacht.

22.08.2008 - 13:42 Uhr

Grob gesagt ja 🙂 Erzeugen anzeigen in diesem Fall. Das anzeigen hast du ja schon gesehen ^^ das Erzeugen funktioniert folgender maßen :


                while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))  // Solange nicht das terminieren Signal gegeben wurde Capture die Bilder in die Queue
                {
                    byte[] ContentArray;
                    mvIMPACT_NET.Image GeneratePicture;
                    if (_setting.IsVorschau)
                    {
                        ContentArray = new byte[1600 * 1200];
                        GeneratePicture = new Image(1600, 1200);
                    }
                    else
                    {
                        ContentArray = new byte[_setting.RedBoxWidth * _setting.RedBoxHeight];
                        GeneratePicture = new Image(_setting.RedBoxWidth, _setting.RedBoxHeight);
                    }
                    Random randomgenerator = new Random();
                    randomgenerator.NextBytes(ContentArray);
                    GeneratePicture.setValues8(ContentArray);

                    _queue.Enqueue(GeneratePicture);  // Enqueue zum befüllen der Queue
                    _syncEvents.NewItemEvent.Set();  // Signalisieren das ein neues Bilder in der Queue ist
                }

so wird das Bild erzeugt in eine Queue gepackt. Ein anderer Thread nimmt es aus der Queue und leitet es an die GUI weiter so wie es in dem oben schon geposteten Code. Wenn ich das Anzeigen des Bildes rausnehmen also den oberen Code bleibt der Speicher absolut stabil.

22.08.2008 - 13:24 Uhr

Hallo,

ich glaube das sieht mit Capi nicht so einfach aus kann ich mir vorstelle. Capi kriegt den Broadcast von der Telefonanlage oder NTBA das ein Anruf kommt. Aber es ist kein expliziti ihm zugeteilterter Anruf. Das ist wie beim Telefon bei ISDN wenn mehrere Telefone klingeln kannst du an einem (ohne Abnehmen) auflegen drücken und es klingeln die anderen weiter. Wenn ich mich irre bitte korrigieren aber soweit ich weiß läuft es so.

Gruß Daniel

22.08.2008 - 13:19 Uhr

Hallo,

oh oh ja da scheint was zu sein. Ich hab mal wieder nen bild mit den neuen Spalten angehängt. Der virtuelle Speicher läuft voll, aber was macht man dagegen?

22.08.2008 - 13:06 Uhr

Hallo Th69,

das ist mir bewusst das das normal wäre 🙂 Wenn du dir die Bilder im Taskmanager anschaust ist der Speicher mit 1,8GB und 2,6GB belegt. Naja ich könnte natürlich einen Computer mit 3GB Speicher haben, aber mein Computer hat nur 1GB ist also ganz fleißig am auslagern und da sollte der GC auf jedenfall anspringen. Was mir auch auffällt ist das die anderen Prozesse auch immer weniger Speicher belegen wie man im Task manager sieht. Minimieren oder Maximieren bringen keine veränderung 🙂

EDIT: Erschreckend "devenv.exe" Was Visual Studio 2008 Standart ist läuft standardmäßig mit 100MB auf den screens geht die dann runter auf 7MB also alles schrumpft oO

Gruß Daniel

22.08.2008 - 12:56 Uhr

Hallo

habe es folgend umgeändert:


        /// <summary>
        /// Methode die nach Verarbeiten eines Bildes aufgerufen wird.
        /// </summary>
        /// <param name="Count"></param>
        /// <param name="Count2"></param>
        private unsafe void ImageProgressed(mvIMPACT_NET.Image mvImage, int verarbeiteteBilder, int QueueCount)
        {
            try
            {
                mvImage.prepareReadAccess();
                IntPtr mvImagePointer = mvImage.pointer;
                WriteableBitmap _wb = new WriteableBitmap(mvImage.width, mvImage.height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
                _wb.WritePixels(new Int32Rect(0, 0, mvImage.width, mvImage.height), mvImagePointer, mvImage.width * mvImage.height, mvImage.width);
                image1.Source = _wb;
                DeleteObject(mvImagePointer);
            }
            finally
            {
                label2.Content = verarbeiteteBilder.ToString();
                label4.Content = QueueCount.ToString();
                mvImage.releaseAccess();
                mvImage.Dispose();
            }
        }

hilft aber nicht das Problem besteht weiter.

22.08.2008 - 12:17 Uhr

Hallo,

mit Perfmon hab ich noch leider nicht gearbeitet 🙁 Also ich hab jetzt den Code etwas herauskristallisiert bei dem die Steigerung des Speichers stattfindet:


        /// <summary>
        /// Funktion um den IntPtr freizugeben da er eine unmanaged Resource ist
        /// </summary>
        /// <param name="hObject"></param>
        /// <returns></returns>
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        /// <summary>
        /// Methode die nach Verarbeiten eines Bildes aufgerufen wird.
        /// </summary>
        /// <param name="Count"></param>
        /// <param name="Count2"></param>
        private unsafe void ImageProgressed(mvIMPACT_NET.Image mvImage, int verarbeiteteBilder, int QueueCount)
        {
            mvImage.prepareReadAccess();
            IntPtr mvImagePointer = mvImage.pointer;
            WriteableBitmap _wb = new WriteableBitmap(mvImage.width, mvImage.height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);
            _wb.WritePixels(new Int32Rect(0,0, mvImage.width, mvImage.height), mvImagePointer, mvImage.width*mvImage.height, mvImage.width);
            image1.Source = _wb;
            label2.Content = verarbeiteteBilder.ToString();
            label4.Content = QueueCount.ToString();
            mvImage.releaseAccess();
            DeleteObject(mvImagePointer);
            mvImage.Dispose();
        }

Ich wüsste nicht was hier schuld an dem ganzen sein sollte?

Gruß Daniel

22.08.2008 - 11:08 Uhr

Ja könnte möglich sein ich hatte jetzt den WindowMouseMove benutzt.

22.08.2008 - 11:03 Uhr

Hallo,

ja das lief im Debugger. Ich habs jetzt mal ohne Debugger laufen lassen was das selbe Ergebnis liefert.

Gruß Daniel

22.08.2008 - 10:25 Uhr

Hallo Community,

ich habe eine für mich sehr merkwürdige Speicherauslastung. Mein Programm erzeugt Bilder und zeigt sie an Grob gesagt. Ich Dispose alles und alles sieht an und für sich wunderbar aus, aber das ist es nicht. Im Task Manager brauch meine Applikation immer weniger Speicher .. erst 40MB und sinkt dann stetig, aber der Speicherverbrauch steigt und steigt... auch über die Auslagerungsdatei weiter weiter sodass Windows diese noch vergrößern muss. Ich habe mal ein Bild vom Taskmanager angehängt. Ich finde das Verhalten ziemlich merkwürdig. Jemand eine erklärung?

Gruß Daniel

21.08.2008 - 15:26 Uhr

Argh!! Ja natürlich auch eine Session 🙂

21.08.2008 - 15:17 Uhr

Hallo ,

ja ich glaube du hast das mit dem Clientseitig nicht konkret verstanden gehabt. 🙂
Der Timer läuft beim Client. Sprich wenn der Client der die Seite neulädt lädt er auch den Timer neu. Wie umgeht man das ganze jetzt?

Ich denke du hast 2 möglichkeiten. Entweder du Synchronisierst den Timer mit dem Server z.b. über eine Datei oder du Synchronisiert den Timer über einen Cookie was wahrscheinlich die schönere Variante ist 🙂

Gruß Daniel

21.08.2008 - 12:24 Uhr

Hallo,

mit Events Arbeiten 🙂 Bei dem MouseDown event mit Button Pressed hast du die Zeile die du haben willst und das folgendende gegenpol ist MouseUp und dann siehste du wo es losgelassen wurde.

Gruß Daniel

21.08.2008 - 12:00 Uhr

Ah achso 🙂
Dann hatte ich das falsch interpretiert Sorry 🙂

Gruß Daniel

21.08.2008 - 11:30 Uhr

Hallo,

Ajax benutzt nix anderes als Javascript. Ist also auch nich Serverseitig.

Gruß Daniel

21.08.2008 - 11:01 Uhr

Hallo,

mit ASP.Net wüsste ich nicht wie es zu realisieren ist den ASP ist eine "Serverseitige" Sache das heißt eine Datei die du aufrufst wird vom Server abgearbeitet und dir Angezeigt. Dabei kommt noch dazu das der Server nicht zum "Client" pushen kann sondern nur der Client abrufen kann, also kann es so nicht funktionieren.

Das helfende Stichwort ist dann Silverlight Javascript Java halt eine Clientseitige ausführung die dann nach Wunsch auch abfragen an den Server senden kann. Der Timer läuft dann lokal auf dem Rechner und kann nach Ablauf ein Event an den Server senden. Für den Kunden sieht es aus als wüde es in der Webseite laufen aber in Wahrheit läuft es lokal auf seinem Computer.

Gruß Daniel

21.08.2008 - 10:13 Uhr

Hallo,

der Browser interpretiert da überhaupt nix 🙂 Das ist die Java Runtime die so aufgebohrt ist das sie zwar noch im Webbrowser angezeigt wird aber über OpenGl auf die Grafikkarte zugreift. Im Prinzip ist es nix anderes als nen lokales Programm was im Webbrowser angezeigt wird, ganz grob gesagt.

Gruß Daniel

20.08.2008 - 16:24 Uhr

Hallo,

ich kenne Searcharoo_6 leider auch nicht, da es sich aber um eine Tutorial reie haltet solltest bei Searcharoo anfangen also bei dem ersten. 🙂 Dadurch kommst du bestimmt voran und da wird auch das Einbinden und Aufbau erklärt.

P.S.: Searcharoo_6 durchsucht auch nur EXIF Tags und macht keine Texterkennung auf Bildern

Gruß Daniel

20.08.2008 - 13:09 Uhr

Hallo,

ich kriege auch direkt eine Exception beim start..^^

19.08.2008 - 15:16 Uhr

Hallo,

hast du den überhaupt verstanden was deine Methode tut? Und bei der for Schleife überschreibst du für jedes gefundenene Objekt die Temperatur wieder.

Gruß Daniel

19.08.2008 - 13:55 Uhr

Hallo,

bei sowas solltest du generell mit einem Timeout arbeiten alleine der Sicherheit wegen. Also am besten einen Timeout der Session auf z.b. 2 Stunden inaktivität setzen und schon löst sich das ganze von allein.

Gruß Daniel

19.08.2008 - 11:04 Uhr

Naja..^^ es gibt Moonlight dazu hier Screenshots. Aber da es kein DirectX auf Linux gibt kann das natürlich nicht benutzt. Ich weiß nicht wie es Moonlight löst weil es auf den Screenshots ja ganz gut aussieht. Musst du mal gucken 🙂

19.08.2008 - 09:08 Uhr

Am Anfang war es noch DirectX und OpenGL jetzt ist es nur noch OpenGL. Nein mir wäre keine Technologie für C# bekannt womit man OpenGL anwendungen für das Web erstellen könnte. Mit Silverlight kann man DirectX benutzen.

Gruß Daniel

18.08.2008 - 12:19 Uhr

Hallo Community,

in meiner Applikation werden Controls mit der Maus verschoben. Jetzt möchte ich wenn diese Controls an den rand geraten die Maus "festsetzen" sprich immer auf den einen festen Punkt setzen. Bei einer GDI Anwendung gab es Mouse.SetPosition was es jetzt in WPF anscheinend nicht mehr gibt. Wie kann ich jetzt die Position der Maus festlegen?

Gruß Daniel

18.08.2008 - 10:30 Uhr

Hallo herbivore,

ja ok kann ich nachvollziehen. Ich bin nur von der Thematik abgedrifftet weil ich ein Mainform im Tray liegen lassen würde und einfach einen Thread mit einem SystemFileWatcher haben würde der dem MainForm rückmeldung gibt und die Liste einträgt damit hätte er viele Probleme die er jetzt hat erledigt.

Hallo thomaschen,

das Problem wenn dein Programm nicht läuft würde ich so Lösen das ich nach dem Alter der Dateien gucken würde. Sprich du wirst ja denke ich eine Datei oder Datenbank Pflegen und die würde ich beim Programmstart laden und dann im gewünschten Ordner das Datum der Dateien mir anschauen und Aktuellere als in deiner Datei/DB eintragen. Alle Änderungen wirst du damit aber leider nicht kriegen. Ansonsten müsstest du Anfangen einen Dienst zu schreiben.

EDIT: Du kopierst die Dateien in ein TMP Verzeichnis? Und was ist wenn die Dateien Gigabyte weise groß sind? Ich weiß nicht ob das die beste Lösung ist.

Gruß Daniel

18.08.2008 - 09:58 Uhr

Hallo,

ja wie gesagt ich wüsste kein .Net OpenSource IRC Client.. aber ich habe dir den Link gepostet weil es dort vielleicht ja versuche oder ähnliches in dem Forum gibt.. es wird ja sicher auch wer die Libary benutzen 😉

Gruß Daniel

18.08.2008 - 09:55 Uhr

Hallo,

nicht direkt einen Client aber es gibt eine OpenSource IRC Libary für .Net, um das Control musst du dich aber wohl selbst kümmern 🙂 Link

Gruß Daniel

18.08.2008 - 09:41 Uhr

Hallo HolySleep,

es gibt kein fertiges Control von Haus aus was deinen wünschen ohne Anpassungen entspricht. Also musst du ein eigenes Control entwickelt was von einen der Controls erbt und dann musst du die Methoden Events überschreiben.

Gruß Daniel

18.08.2008 - 09:18 Uhr

Hallo herbivore,

Warum hat das mit dem Thema nix zu tun? Wenn man es wirklich will kann man den Childform das Mainform übergeben und über Invokes bzw Delegates auf Methoden der Mainform zugreifen? Klar setzt man das bei Threading ein aber das geht doch bestimmt auch normal. Das es in dem Fall mit ChildForm und Mainform nicht die eleganteste Lösung ist sollte klar sein. Ich würde aber vermuten das er es aus dem MainForm starten möchte weil er Controls aktualisiert oder andere Sachen muss die im MainForm stattfinden. Wenn das der Fall ist muss er sowieso wenn er auslagert mit Delegates und Invokes arbeiten egal wirum er es dreht.

Gruß Daniel

18.08.2008 - 09:14 Uhr

Hallo,

erstmal würde ich davon weggehen das sie eine Textbox verwenden 😉 Sie werden entweder eine RichTextBox oder eine erweiterte Listbox verwenden und dort ist es ganz einfach weil die nicht automatisch Scrollen wenn man etwas hinzufügt soweit ich weiß. Ansonsten überschreibt man das 🙂

Gruß Daniel

18.08.2008 - 09:10 Uhr

Guten Morgen,

das Stichwort sind Delegates und/oder Invoke bzw BeginInvoke. Unter diesen Stichpunkten solltest du finden was du suchst 🙂

Gruß Daniel

18.08.2008 - 08:05 Uhr

Hallo Joey83,

das Stichwort was du suchst nennt sich Silverlight 🙂 Damit kannst du 3D für Websites entwickeln.

Gruß Daniel

15.08.2008 - 16:53 Uhr

Bist du dir sicher das die Search Engine das kann? Hab das gefühl das das Ding das nicht kann sondern mit jpg einfach den Namen der Datei oder Maximal keywords die im JPG eingebettet sind auslesen kann.

Gruß Daniel

15.08.2008 - 08:08 Uhr

Hallo,

ich benutze Privat Vista Ultimate 64bit mit Visual Studio 2008 Express SP1 mit .Net Framework 3.5 SP1 und hatte kein Problem es zu installieren lief ohne Probleme.
Hast du vielleicht keine Administrationsrechte?

Gruß Daniel

14.08.2008 - 12:07 Uhr

Hallo Community 🙂

Ich bin gerade dran zu arbeiten ein Panel mit der Maus bewegbar zu machen. Das funktiert auch eigentlich ganz gut. Aber jetzt ist mir aufgefallen das das Event von dem Canvas "MouseMove" nur kommt wenn die Maus über ein Child Control fährt, aber nicht wenn die Mouse sich über den Canvas selbst bewegt. Das ist in diesem Falle bei mir ziemlich Blöd weil wenn man die Maus nur ein Stück zu schnell bewegt kommt das Event nicht mehr und alles ist hin 🙁 Warum macht man den sowas? Hat jemand eine Idee zur Lösung?

Gruß Daniel

//EDIT: Mir ist bewusst das wenn ich das MouseMove Event vom Window nehme es immer gefeuert wird. Ich hätte es gerne im Canvas weil das Canvas in meinem Fall nicht über die ganze Applikation geht sondern verschachtelt in einem Grid sitzt.

14.08.2008 - 08:49 Uhr

Die Visual Studio 2008 Express Edition unterstützen keine Add-ins deswegen mussten wir uns auch die Standard zulegen um Sachen wie AnkhSVN nutzen zu können etc.. 🙂

Gruß Daniel

11.08.2008 - 17:39 Uhr

Hallo,

das sind leider nur die Englischen Versionen. den Deutschen Online-Installer gibt es anscheinend noch nicht auf der Microsoft Seite aber das Deutsche ISO für das SP1 scheint es zu geben 😉. Hier der Link

Gruß Daniel

08.08.2008 - 15:12 Uhr

Hmm ja wäre nicht schön ^^ Mich ärgerts halt das ich die Applikation mit Winforms lauffähig ist und ohne zu murren macht die Picturebox alles ohne wirkliche cpulast und dann kommt das neue tolle WPF mit DirectX unterstützung und brauch um Bilder anzuzeigen 40-50% CPU Last? Das verstehe ich nicht ^^

Gruß Daniel

08.08.2008 - 12:36 Uhr

Hmm ich glaube wir haben wieder aneinander vorbeigeredet 🙂 Der Speicher schwankt nur bei der zuweisung vom Image Control so stark aber wird immer freigegeben also sehe ich das als nebensächlich an. Das störende ist das die CPU-Last nur von der zuweisung von BitmapSource 40-50% CPU-Last beansprucht. Das kann ja eigentlich nicht sein. Bei der Auswahl sollen es 1600x1200 sein. Es macht aber auch keinen großen Unterschied weil wenn die Auflösung niedriger ist werden es mehr Bilder 😉 Später wird nur ein Ausschnit beim Auswahl fenster ausgewählt und dann sind das vielleicht 300x400 Pixel aber 20-30 Bilder pro Sekunde🙂

Gruß Daniel

08.08.2008 - 11:58 Uhr

Hallo,

also ich habe mal folgendes Konstruktion probiert:


            MemoryStream stream = new MemoryStream();
            Bitmap tmpimg = new Bitmap(1600,1200);
            tmpimg = Image.convertToBitmap();
            tmpimg.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            BitmapImage tmpbild = new BitmapImage();
            tmpbild.BeginInit();
            tmpbild.StreamSource = stream;
            tmpbild.EndInit();
            image1.Source = null;
            BitmapSource bildchen = tmpbild;

Wenn ich das erstmal so laufen lasse komme ich auf 30% CPU Last wobei da wohl das Bitmap schuld ist aber das kann man optimieren. Der Speicher ist auch sehr Stabil, der schwankt vllt im 10MB Bereich. Aber wenn ich dann noch folgende Zeile hinzufüge:


            image1.Source = bildchen;

Dann steigt die CPU Last auf 60-80% und der Speicher Schwankt so bei 40-60MB
ist jetzt das Image Control von WPF blöd oder wie?

08.08.2008 - 10:46 Uhr

Hmm, das klingt überhaupt nicht schön. Die Bilder sind von einer Live angesteuerten Kamera, sprich sie ändern sich ständig. Zwischenspeichern wird wohl aber denke ich nicht gerade performanter sein. Bei kleineren Ausflösungen sind es gerne mal 20-30 Bilder die Sekunde. Hmm 🙁 Noch Ideen und Vorschläge?

Gruß Daniel

08.08.2008 - 10:13 Uhr

Hallo,

über das GDI mit DeleteObject war ich auch gestolpert wusste nur nicht anzuwenden peinlich. Naja jedenfalls ist jetzt der Speicher vollkommen in Ordnung, sprich es wird wieder alles frei gegeben wunderbar. 🙂

So groß die freude so deprimierent das die Umwandlung der Bilder von Bitmap zu BitmapSource auf meinem Xeon 2,8Ghz HT rund 50% CPU-Last beansprucht. Es kann doch nicht sein das einfach das Konvertieren der Bilder soviel Performance nimmt? Es sind "gerade mal" 8 Bilder pro Sekunde in 1600x1200 8bpp Mono. Bei WinForms das Bitmap direkt zuweisen hat keine Perfomance gezogen, jedenfalls nicht spührbar. Und bei WPF muss ich mich mit 50% CPU auslastung abgeben wegen Konvertierung? Ich hoffe das man da was machen kann🙁

Gruß Daniel