Laden...

merkwürdiges Thread-Verhalten bei DirectX

Erstellt von Rodney vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.790 Views
R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren
merkwürdiges Thread-Verhalten bei DirectX

Hallo Leute,

ich habe in meinem Programm einen Thread laufen, der nach dem initalisieren von DirectX aber ein sehr komisches Verhalten an den Tag legt.
Als wenn er überhaupt nicht mehr beachtet werden würde, führt er keine Aktionen mehr aus. Die Priority steht auf Highest.

Der Thread ist als static in einer globalen Klasse definiert und wird schon bei Programmstart in einem Dialog gestartet wo er auch noch funktioniert.

Gruß, Rodney

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Rodney,

ich fürchte, in dieser Allgemeinheit ist das nicht zu beantworten.

herbivore

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

ich wüsste jetzt nicht auf was ich näher eingehen sollte.
Im Thread läuft jedenfalls ein synchroner TCP Socket.

210 Beiträge seit 2005
vor 18 Jahren

Wie schaut es denn mit anderen Threads und Locks aus?
Könnte sein, dass dein hoch priorer Thread nicht zum Rechen kommt, da ein anderer Thread einen Lock hält und diesen nicht wieder rausrückt.

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

keine locks und auch nur dieser eine zusätzliche Thread

4.221 Beiträge seit 2005
vor 18 Jahren

Ein Schuss in's Blaue

Kann es sein, dass dieser Thread Zugriffe auf UI-Controls macht ? Wenn ja dann Marshalle diese in den UI-Thread (Control.Invoke.....) über ISynchronizeInvoke.Invoke...

Zugriffe auf UI-Controls aus einem nicht UI-Thread führen meist zu Blockaden... entweder UI-blockiert.. oder ein Thread usw...

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

P
939 Beiträge seit 2003
vor 18 Jahren

In Threads ausgeführten Code würde ich immer komplett in einen try/catch-Block einschliessen. Ansonsten bekommt man nicht mit, wenn eine Exception auftritt. Der Thread wird nur still und leise beendet.

Gruss
Pulpapex

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

try catch hab ich natürlich drin

Was ist ein UI?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Rodney,

UI = User Interface = Benutzeroberfläche

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
ich fürchte, in dieser Allgemeinheit ist das nicht zu beantworten.

Im Prinzip könnte man fast einen Filter für Post's einführen....

if (problem = unerklärlich && Post.Contains("Thread")
{

WahrscheinlichkeitDassThreadDaranSchuldIst=95%;

}

🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

Nein definitiv keine Zugriffe auf die Benutzeroberfläche.
Ich glaub, ich schreib das ganze auf eine asynchrone Verbindung um,
dann kann ich diesen Thread-Mist endlich ganz rauswerfen 🙄
Trotzdem danke für eure Antworten.

210 Beiträge seit 2005
vor 18 Jahren

Thread-Mist? Sorry, aber diese Aussage ist Mist. 😜

Wenns nicht zu viel ist, dann poste doch mal wie der Thread angelegt wird und was das Programm sonst noch treibt.

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

4.221 Beiträge seit 2005
vor 18 Jahren

Original von exec
Thread-Mist? Sorry, aber diese Aussage ist Mist. 😜

Genau. Je nachdem worum es beim zu lösenden Problem geht entpuppt sich dann eher ne Asynchrone Variante als "Mist"......

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

das ganze Programm ist doch arg lang (> 3000 Zeilen)

der Thread wird so erstellt:


globales.t_receive = new Thread(new ThreadStart(globales.verbindung.Recv));
globales.t_receive.Start();
globales.t_receive.Priority = System.Threading.ThreadPriority.Highest;

Das passiert noch im Konfigurationsdialog.

Die verbindung.Recv sieht so aus:


		public void Recv() {
			try
			{
				byte[] empfangsbuffer = new byte[1024];
				
				while(true) 
				{
					recv = new int();
					data = new byte[1024];
					try 
					{
						if (globales.spiel_gestartet)
							while(ref_spielschleife == null) System.Threading.Thread.Sleep(100);
						recv = client.Receive(data);
					}
					catch
					{
						globales.logging.schreiben("Fehler bei client.Receive()!");
					}
					
					byte[] paket;
					
					if (recv > 0)
					{
												Array.Copy(data,0,empfangsbuffer,0,recv);
						
						int p_len = (int)BitConverter.ToUInt16(empfangsbuffer,0);
					
							paket = new byte[p_len];
							byte p_typ = empfangsbuffer[2];
							Array.Copy(empfangsbuffer,3,paket,0,p_len-1); // länge und typ wird nicht mitkopiert!
											if (p_typ == (byte)pakettyp.SERVER_PING) 
							{
								globales.logging.schreiben(":Ping");
								this.send_pong();
							}
							else
							{
								this.packet_notify.NotifyPacket(paket, p_typ);
							}
								
					}
				}
			}
		catch (Exception e) // Wenn eigentlich nicht beendet werden soll, ne Fehlermeldung ausgeben!
		{
	
			if (!this.beenden) MessageBox.Show("Es ist zu einem Fehler in dem Recv-Thread gekommen:\n" + e.Message + "\nausgelöst durch:\n" + e.Source + "\nInner Exception:\n" + e.InnerException + "\nStack Trace: \n" + e.StackTrace);
			
				globales.logging.schreiben("Exception im Receivethread geworfen: " +  e.Message);
				globales.logging.schreiben("Stack Trace:" + e.ToString());
				throw e;	
		}
		
}

Gruß, Rodney

_
416 Beiträge seit 2005
vor 18 Jahren

Hallo,

recv = new int(); *amkopfkratz

while(ref_spielschleife == null) System.Threading.Thread.Sleep(100);

schon geprüft dass ref_spielschleife auch wirklich nicht null ist?

Sendet der client auch was? Ansonsten blockiert er natürlich auch ewig.

Ansonsten setz doch einfach mal nen Haltepunkt un den Anfang und versuch nachzuvollziehen warum nix passiert.

cu, tb

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

Original von tb
Hallo,

recv = new int();
*amkopfkratz

while(ref_spielschleife == null) System.Threading.Thread.Sleep(100);
schon geprüft dass ref_spielschleife auch wirklich nicht null ist?

Sendet der client auch was? Ansonsten blockiert er natürlich auch ewig.

Ansonsten setz doch einfach mal nen Haltepunkt un den Anfang und versuch nachzuvollziehen warum nix passiert.

cu, tb

das mit recv und data war echt nen bisschen komisch, hab ich geändert.
ref_spielschleife ist in einem Fall null und dann soll er halt solange warten bis der Wert sich ändert und dann weitermachen.

Natürlich bekommt er was gesendet (der Auszug ist vom Client)

Gruß, Rodney

210 Beiträge seit 2005
vor 18 Jahren

Von welchem Typ ist 'ref_spielschleife' und in welchem Kontext wird es benutzt?

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

Original von exec
Von welchem Typ ist 'ref_spielschleife' und in welchem Kontext wird es benutzt?

public hauptspielschleife ref_spielschleife;
Hauptspielschleife ist eine andere Klasse in der das Hauptprogramm später abläuft.
Wenn DirectX gestartet wird, wird baldmöglichst Ref_spielschleife gesetzt, damit der Netzwerkthread darauf zugreifen kann (er muss eine bestimmte Funktion aus der Hauptspielschleife aufrufen)

Gruß, Rodney

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 18 Jahren

keiner mehr ne Idee?
kann es sein das die Thread-Priorität einfach so weit abrutscht das er nicht mehr dazu kommt die schleife auszuführen? Im Hauptprogramm läuft aber afaik auch nichts rechenaufwendiges ab.