Interessantes Problem beim Bitmap locken in Verbindung mit Mono und .NET

Manchmal sucht man den Fehler an der falschen Stelle, wie ich gestern bei einem Quelltext feststellen dürfte welcher auf .NET und Mono laufen sollte. Man nehme folgenden C# Code:

Bitmap bmp=new Bitmap((int)width, (int)height, PixelFormat.Format32bppArgb);
BitmapData data=bmp.LockBits(new Rectangle(0, 0, (int)width, (int)height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

Marshal.Copy(intern.imageData, 0, data.Scan0, (int)(width*height*4));

bmp.UnlockBits(data);
data=null;
return bmp;

Dieser Code kopiert Daten in ein Bitmap. Unter .NET funktioniert dies tadellos. Also lag der Gedanke nah das dies ein Mono Problem ist. Nach etlichen Tests ergab sich dann aber das es genau umgekehrt ist. Es liegt an der Zeile:

BitmapData data=bmp.LockBits(new Rectangle(0, 0, (int)width, (int)height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

und zwar speziell an dem ImageLockMode.ReadOnly. Dort könnte z.B. ImageLockMode.ReadWrite stehen und schon würde es unter .NET und Mono funktionieren. Doch warum geht es nun bei .NET trotzdem mit der falschen Variante? Die .NET API reicht die Parameter korrekt an die GDI+ weiter, diese ignoriert sie aber. Aus diesem Grund funktionierte es unter .NET. Sprich Mono hat alles richtig gemacht :)

Vala

Erstaunt stellte ich gestern fest das der neue Standardfotomanager unter Ubuntu (Shotwell) in Vala geschrieben ist. Bei Vala handelt es sich um eine Programmiersprache welche stark an C# und Java angelehnt ist. Dabei benötigt sie aber keine Laufzeitumgebung. Man hat dann also eine Sprache welche eine moderne Syntax bietet und keine Laufzeitumgebung benötigt sondern nativ auf dem System läuft. Im Gegensatz zu .NET/Mono hat die Sprache keinen Garbage Collector sondern implementiert automatische Referenzzählung zur Speicherverwaltung.

Beim durchschauen der Syntax (verglichen mit C#) sind mir einige Unschönheiten aufgefallen welche einige Konstrukte nicht sehr elegant aussehen lassen, aber das muss man sich wahrscheinlich mal in einem kleinen Projekt anschauen. Es ist möglich mit Vala plattformunabhängige Anwendungen zu schreiben. Als Standardbibliothek steht einem die glibc sowie die Geelib zur Verfügung. Der Vala Compiler wandelt den Quellcode in C Code um und kompiliert diesen dann anschließend. Definitiv eine Sprache die man sich mal anschauen sollte :) Die offizielle Seite von Vala ist unter http://live.gnome.org/Vala zu finden.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Vala_%28Programmiersprache%29

DockPanel Suite

Im Visual Studio gibt es eine wunderbare Funktionalität zum docken von Fenstern. Möchte man so etwas nachbauen kann man natürlich sein Geld in eine Komponentensammlung investieren. Die andere Variante ist es die DockPanel Suite zu benutzen welche unter der MIT Lizenz steht. Sie bietet dabei eine sehr große Flexibilität was das Fenstermanagement angeht und ist erstaunlich robust gebaut. Zu finden ist die Suite unter http://sourceforge.net/projects/dockpanelsuite/.

Das Ding hat auch ein kleines Problem mit dem Rahmen im Fullscreenmodus. Dazu kommentiert man einfach ein paar Zeilen in der DockWindow.cs aus:

		public virtual Rectangle DisplayingRectangle
		{
			get
			{
				Rectangle rect = ClientRectangle;
				// if DockWindow is document, exclude the border
				if (DockState == DockState.Document)
				{
					//rect.X += 1;
					//rect.Y += 1;
					//rect.Width -= 2;
					//rect.Height -= 2;
				}

                                ...

Danach ist das Problem Geschichte und das Control angenehm rahmenlos :)

Weitere Informationen gibt es unter:
https://sourceforge.net/projects/dockpanelsuite/forums/forum/402316/topic/2011982/index/page/1

Interessanter C++ Blog

Nach der Umstellung auf Visual Studio 2010 hatte ich einige Probleme mit einigen C/C++ Projekten. Einfach weil Microsoft bei manchen Sachen standardkonformer geworden ist. Dadurch funktionierten einige Dinge nicht mehr. Sehr geholfen bei solchen Problemen hat mit der Blog von Martin Richter welcher unter http://blog.m-ri.de/ zu finden ist. Reinschauen lohnt sich ;)

Garbage Collector für C/C++

In C bzw. C++ muss man den Speicher welchen man alloziert auch irgendwann wieder freigeben. Macht man dies nicht entstehen sogenannte Memory Leaks, der Speicher füllt sich so immer weiter. Es wäre doch schön wenn es auch unter C/C++ einen Garbage Collector gäbe welcher am Ende (und zwischendurch) einfach den Speicher von Objekten bereinigt welche nicht mehr benötigt werden. C wäre nicht C wenn nicht schon irgendjemand so etwas implementiert hat. Und so findet man unter http://www.hpl.hp.com/personal/Hans_Boehm/gc/ eine Implementation desselben. Ausprobieren lohnt sich, denn es schont die Nerven ;)

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Memory_leak
http://de.wikipedia.org/wiki/Garbage_Collection