Überbleibende Prozesse
-
Hallo,
ich habe ein Problem mit nach beenden eines programmierten Programms zurückbleibenden Prozessen.
Nachdem ich mein Beispielprojekt 3 oder 4 mal gestartet hatte liess es sich nicht mehr im debugging-modus starten, mit der Fehlermeldung:Fehler 1 Datei obj\Release\DX16.exe kann nicht in bin\Release\DX16.exe kopiert werden. Der Prozess kann nicht auf die Datei bin\Release\DX16.exe zugreifen, da sie von einem anderen Prozess verwendet wird. DX16
Ein Blick in den taskmanager verriet mir danach, dass von jedem mal wenn ich das Projekt gestartet hatte in den Windows-Prozessen ein "DX16.exe" übriggeblieben war. Manchmal auch ein Prozess "Dx16.vhost.exe.
Irgendwas scheint also in meinem Projekt nicht richtig aufgeräumt zu werden wenn ich es beende.
Nun habe ich die erstellung des Formulars schon auf 2 varianten Probiert:
using (Form1 frm = new Form1()) { frm.Show(); frm.InitializeGraphics(); Application.Run(); }
,was ja eigentlich dazu führen sollte, dass "frm" nach beenden dieses Blocks sauber entfernt wird...
und:
{ Form1 frm = new Form1(); frm.Show(); frm.InitializeGraphics(); Application.Run(); }
dadurch entfällt zwar die Fehlermeldung und das programm statet Ordungsgemäß, aber ich habe im nachhinein immer noch dutzende gleichnamige Prozesse geöffnet.
Vielleicht wäre noch zu erwähnen, dass ich zwar schon viele (16) Projekte dieser art geschrieben habe (die sich mit DirectX befassen), aber erst seit Projekt 14 habe ich dieses problem mit den nicht verschwindenden Prozessen. Neu ist seitdem nur, dass ich jeweils eine HLSL-Datei in mein Projekt eingebunden habe, um shader zu schreiben.
Jemand eine Idee woran das liegen könnte und wie ich das beheben kann?...
Danke schonmal
-
Wie immer mein einleitendes Bitching: Wer lesen kann (und es auch anwendet) ist klar im Vorteil. Daher zum Thema vhost.exe dieser Link:
http://blogs.msdn.com/dtemp/archive/2004/09/09/215764.aspx
Den man ganz nebenbei in weniger als 2 Minuten per Google finden kann.
ZUm zweiten Problem kannich ohne weitere Kenntnisse des Codes nur raten. Soviel als Hinweis: Zustätzliche Threads die man startet und die _nicht explizit als Backgroundworker geflagged sind laufen auch dann weiter, wenn der Hauptthread beendet wird. Dies kann man verhindern indem man vor dme Start eines Thread explizit Backgroundworker auf true setzt oder indem man den ThreadPool verwendet(weil alle Threads des ThreadPools automatisch BackgroundWorker sind)
Ansonsten, warum nicht einfach im Debugger das programm normal beenden und dann in der Threadliste schauen welche Threads denn noch laufen?
-
Schon klar ...
ich habe mich nicht im besonderen aud den vhost-prozess bezogen, sondern mein eigentliches Problem ist ja, dass mein Programm nicht vollständig geschlossen wird.Weitere Threads erstelle ich nicht explizit. Im Grunde besteht mein gesamtes Programm nur aus den 4 Funktionen
public bool InitializeGraphics()
in der ich mein device erstelle
private void LoadMesh(string file);
in der ich die Datei "tiny.x" aus der DirectXSDK lade,
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
in der ich die szene Beginne, DrawMesh aufrufe und die Szene wieder beende
und
private void DrawMesh(float yaw, float pitch, float roll, float x, float y, float z)
die das Modell zeichnet.
Mein Problem, möchte ich nun wiederholen, ist, dass ich schon ein dutzend Programme nach diesem Muster geschrieben habe, und alle haben einwandfrei funktioniert. Aber seitdem ich in den Programmen die "effect"-Komponente verwende und eine HLSL Datei eingebunden habe um mit der programmable Pipeline zu arbeiten, bleiben die Prozesse der Programme auch nach dem Normalen schliessen (sowohl beim starten mit F5 als auch beim ausführen der .exe) geöffnet.
Ich erstelle die Komponente in "InitializeGraphics"
//Effekt-Objekt aus der HLSL-Datei erstellen effect = Effect.FromFile(device, @"..\..\simple.fx", null, null, ShaderFlags.None, null); effect.Technique = "TransformTexture";
und verwende sie in "DrawMesh"
effect.SetValue("WorldViewProj",worldViewProj); int NumPasses = effect.Begin(0); for (int i = 0; i<NumPasses;i++) { effect.BeginPass(i); for (int j = 0; j<meshMaterials.Length;j++) { device.SetTexture(0,meshTextures[j]); mesh.DrawSubset(j); } effect.EndPass(); } effect.End();
Wird vielleicht ein neuer Thread irgendwo erstellt den ich manuell schliessen müsste..?
-
Vielleicht kann ich das Problem auch hierdurch etwas veranschaulichen:
Bei meinen alten Programmen wird der Debug-Modus (F5) mit einem Close()-Befehl oder durch klicken auf das Schliessen-Kreuz in der oberen Rechten Ecke des Formulars automatisch mit dem Formular zusammen geschlossen.
Bei den genannten neuen Programmen aber, wird nur das Formular geschlossen, ich muss den Debugger aber mit einem klick auf die "Stop"-Schaltfläche manuell beenden. Woran kann das liegen, oder wie kann ich das beheben..?
-
TH3LL schrieb:
Mein Problem, möchte ich nun wiederholen, ist, dass ich schon ein dutzend Programme nach diesem Muster geschrieben habe, und alle haben einwandfrei funktioniert.
Es ist irrelevant wie oft Du das Muster bereits benutzt hast bevor der Fehler zum ersten mal sichtbar wurde, er kann trotzdem schon immer da gewesen sein. Durch diese "das hab ich aber schon immer so gemacht"-Denkweise blockierst Du letzten Endes nur Deine eigene Entwicklung als Programmierer...
TH3LL schrieb:
Vielleicht kann ich das Problem auch hierdurch etwas veranschaulichen:
Bei meinen alten Programmen wird der Debug-Modus (F5) mit einem Close()-Befehl oder durch klicken auf das Schliessen-Kreuz in der oberen Rechten Ecke des Formulars automatisch mit dem Formular zusammen geschlossen.
Bei den genannten neuen Programmen aber, wird nur das Formular geschlossen, ich muss den Debugger aber mit einem klick auf die "Stop"-Schaltfläche manuell beenden. Woran kann das liegen, oder wie kann ich das beheben..?
Das liegt primär genau an deinem beschriebenen Problem, eben das noch mindestens ein Thread läuft. Also anstatt auf Stop zu clicken, drück mal auf Break All (das Pausen.Symbol neben Stop) und schau Dir dann die Liste der laufenden Threads an (Debug/Windows/Threads)
In der Liste solltest Du den Schuldigen finden der noch läuft...
-
Also anstatt auf Stop zu clicken, drück mal auf Break All (das Pausen.Symbol neben Stop) und schau Dir dann die Liste der laufenden Threads an (Debug/Windows/Threads)
In der Liste solltest Du den Schuldigen finden der noch läuft...
Naa toll...
Unter Debuggen -> Fenster befindet sich bei mir kein eintrag "threads"... Nur "Ausgabe" "Überwachen" "Lokal" "Direkt" und "Aufrufliste"... Kann es sein, dass meine VCS Express Version diese Funktion nicht hat?
-
Die Menues sind unterschiedlich wenn der Debugger läuft und wenn er nicht läuft. Bei laufendem Debugger ist der Menüpunkt bei mir zu sehen. Ansonsten kann es natürlich auch an der Express Version liegen, aber ka, hab deren Funktionsumfang nicht im Kopf.