Registrieren | Einloggen
Suche | FAQ


Autor Thema: C# MDA Loader Lock
=GXR=Silver92
styles/grau.css
=GXR=
******
ID # 244



-495-402-076

Beiträge: 895
Mitglied seit: Februar 2008

Erstellt am 11. Januar 2013 23:50 (#1) Zitat E-Mail PN
Hey,

vielleicht kann mir ja einer von euch helfen. Ich bin an einem Snake in C# dran. Programmiere das ganze mit DirectX in Visual Studio 2010 und .NET Framework 4.0.

Nun habe ich vor kurzem etwa 7 mal beim erstellen des Projekts eine Warnung gekriegt.

In etwa so sah die aus:

LoaderLock was detected
Message: DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' is attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.

Hab auch mal den Prozess im Task Manager beobachtet. Die exe ist 32kb gross, sobald ich beginne zu spielen geht der Arbeitsspeicher für den Prozess auf 1,8GB hoch, zumindest solange es läuft. Wenn ich pausiere, bleibt der Arbeitsspeicher wo er ist, sobald ich weiter spiele, steigt er weiter bis er die 1.8gb erreicht hat...

Laut msdn hat das auch einen zusammenhang mit C++. Da hier welche sind, die das beherrschen, können die mir vielleicht weiter helfen.

Achja die Warnung wurde mir immer hier bei InitalizeKeyboard angezeigt:

Zitat:
static void Main()
{
using (Program mainFrame = new Program())
{
mainFrame.InitializeGraphics();
mainFrame.InitializeKeyboard();
mainFrame.InitializeFont();
mainFrame.LoadContent();
mainFrame.Location = new Point((Screen.PrimaryScreen.Bounds.Width - mainFrame.Width) / 2, (Screen.PrimaryScreen.Bounds.Height - mainFrame.Height) / 2);
Application.Run(mainFrame);
}
}


In der Methode befindet sich folgender Code:

Zitat:

private void InitializeKeyboard()
{
keyb = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
keyb.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
keyb.Acquire();
}


Und da ich denke, es hat was mit dem Resx-File und den eingebetteten Texturen zu tun, poste ich den Codeabschnitt von LoadComponents auch gleich noch.

Zitat:

private void LoadContent()
{
Bitmap snakeTextImg = Properties.Resources.snaketexture;
Bitmap levelUpTextImg = Properties.Resources.leveluptexture;

snakeTexture = Texture.FromBitmap(device, snakeTextImg, Usage.None, Pool.Managed);
levelUpTexture = Texture.FromBitmap(device, levelUpTextImg, Usage.None, Pool.Managed);

StartingGame();
}



Es trat nämlich erst auf, als ich mit dem Resx-File und diesem laden der Texturen daraus gespielt habe, da ich am Ende nur ein exe File haben möchte.

Achja die Warnung ist leider nicht bloss nur eine Warnung, dass sich das Spiel aufhängt, es macht es nämlich nach einer gewissen Zeit auch. Ich kann zwar noch Esc drücken (hab ich im Code als Exittaste eingebaut), aber im Programm selbst tut sich nichts mehr und die Schlange bleibt stehen.

Es ist also nicht so, dass ich keine Rückmeldung mehr kriegen würde vom Programm.

Porsche Carrera GT <3
Koenigsegg CCXRE <3
GXRdrago
Co-Clan Leader
=GXR=
**********
ID # 13



Beiträge: 2217
Mitglied seit: Juni 2003

Erstellt am 12. Januar 2013 00:01 (#2) Zitat E-Mail PN
kann nur raten, da ich dazu neige einen großen bogen um .NET zu machen, wenn es ums selbst programmieren geht...

aber es klingt so, als würdest du ständig neue objekte erzeugen, die im speicher bleiben und nicht gelöscht werden, nachdem sie ihren dienst getan haben.

bei deinem code sehe ich nochts böses... aber wie gesagt, habe mich von .NET fern gehalten.

Maik

Wer nicht über die Zukunft nachdenkt, wird keine haben.
=GXR=Silver92
styles/grau.css
=GXR=
******
ID # 244



-495-402-076

Beiträge: 895
Mitglied seit: Februar 2008

Erstellt am 12. Januar 2013 00:59 (#3) Zitat E-Mail PN
Ich hab den Fehler. statt 1.8Gb nur noch 50Mb. Ein bisschen peinlich, aber passiert halt mal.

Nach ewigem auskommentieren meines Codes, hab ich gesehen, dass der Fehler bei spriteBatch.Draw2D steckt. Sprich da wo ich meine Texturen zeichne. Über google hab ich dann endlich einen Thread gefunden, welcher mich dann auf die Lösung gebracht hat.
Ich hab in der OnPaint Methode, die dauernd aufgerufen wird, vor dem Zeichnen der Texturen den spritebatch immer neu deklariert, das hatte er nicht gern. Rauf in die Initialisierung gepackt und voilà es funktioniert :hammer:

Hätte nie gedacht, dass eine einzelne Deklaration soviel ausmacht, vorallem da es nur kleine poplige Vierecke sind die ich da Zeichne ;) Man lernt nie aus^^

Edit: Wenn ichs fertig hab werd ichs im Forum posten, bis dahin dauerts aber noch ein wenig :)

Porsche Carrera GT <3
Koenigsegg CCXRE <3
=GXR=Silver92
styles/grau.css
=GXR=
******
ID # 244



-495-402-076

Beiträge: 895
Mitglied seit: Februar 2008

Erstellt am 01. Februar 2013 18:40 (#4) Zitat E-Mail PN
So hab das Snake nun "portiert" und mit den normalen System.Drawing Libraries gemacht. Ohne DirectX. Ich vermisse nur die Vsync Funktion, den Rest konnte ich genauso anwenden, wie mit DX nur halt ein paar Namensänderungen der Methoden etc.

Bin auch schon bald ganz fertig damit :) Danach werd ich wohl an meiner Strecke mal wieder weiter basteln. Hab ab Mittwoch endlich wieder massig Zeit.

Porsche Carrera GT <3
Koenigsegg CCXRE <3
=GXR=Silver92
styles/grau.css
=GXR=
******
ID # 244



-495-402-076

Beiträge: 895
Mitglied seit: Februar 2008

Erstellt am 08. Mai 2013 07:37 (#5) Zitat E-Mail PN
Dank meines Studiums weiss ich jetzt für was der Loaderlock gut ist. Tritt bei Multithreading auf und die Warnung verhindert mögliche Deadlocks von Win32 Funktionen, falls das hier jemand versteht^^

Achja das Snake lad ich noch hoch. Hab das vor einiger Zeit mal so fertig gestellt, auch wenn ich eventuell später noch dran basteln werde ;)

Porsche Carrera GT <3
Koenigsegg CCXRE <3