Laden...

Multithreads, DataGrid

Erstellt von scharti84 vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.716 Views
S
scharti84 Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren
Multithreads, DataGrid

Hallo

ich habe folgendes Problem:

Ich möchte mir eine Anwendung programmieren, die mir die aktuelle Prozesse meines Rechners ausliest und in einem DataGrid darstellt!

soweit so gut...

und jetzt das Problem:
dieses DataGrid soll jetzt laufend aktualisiert werden, deshalb wollte ich die Methode 'readProcess' in einem eigenen Thread starten

Die Methode 'readProcess' liefert mir alle aktuellen Prozesse und übergibt Werte, wie Name, Priorität, usw an die Methode 'displayProcess'

'displayProcess' schreibt die erhaltenen Daten ins DataGrid

doch das ganze Werk lief nicht so wie ich mir das vorgestellt habe, da ich auf das DataGrid mit meinem Thread nicht zugreifen kann, einerseits logisch da vermutlich dieses DataGrid einen eigenen Thread besitzt und nur der draufschreiben darf. 🤔

Jetzt die Bitte an euch
wie kann ich das Problem lösen, vielleich könnte wer ein kleines Codebeispiel anführen in seiner Antwort

Nachtrag:
Auszug aus dem Code


[STAThread]
static void Main() 
{
	Application.Run(new frmProzesse());
	ThreadStart ts = new ThreadStart( readProcess );
	Thread th = new Thread( ts );
	th.Start();				
}
private static void readProcess ()
{			
	Process[] myProcesses = Process.GetProcesses();
				
	for (int pos = 0;;)
	{
		foreach ( Process myProcess in myProcesses)
		{
			writeProcess( pos, myProcess.Id.ToString(), myProcess.ProcessName, myProcess.PrivateMemorySize.ToString() );
			pos ++;
		}
		pos = 0;
	}
}
private static void writeProcess (int pos, string ID, string Name, string Size )
{
				
	if ( ds == null )
	{
		ds.Tables.Add();
		ds.Tables[0].TableName = "Prozesse";
		ds.Tables[0].Columns.Add("ID");
		ds.Tables[0].Columns.Add("Prozess");
		ds.Tables[0].Columns.Add("Speicher");
	}
	if ( ds.Tables[0].Rows.Count < pos )
	{ 
		ds.Tables[0].Rows.Add(new string[] {ID, Name, Size} );
	}
	else
	{
		ds.Tables[0].Rows[pos]["ID"] = ID;
		ds.Tables[0].Rows[pos]["Prozess"] = Name;
		ds.Tables[0].Rows[pos]["Speicher"] = Size;
	}
	dataGrid1.DataSource = ds;
	dataGrid1.DataMember = "Prozesse";
}

wo würde jetzt invoke,... eingebaut werden
und was muss ich machen, dass das DataSet ds und das Form-Controll dataGrid1 erkennt.
Fehlermeldung: "Einen Objektverweis auf die Variablen festlegen" (so ähnlich)

Besten Dank im Voraus
Andreas

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo scharti84,

du musst Control.Invoke bzw. Control.BeginInvoke verwenden.

herbivore

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo scharti84,

Einen Objektverweis auf die Variablen festlegen

Standardfehler => In die Doku gucken (Fehlernummer im Index) oder Forumssuche.

wo würde jetzt invoke,... eingebaut werden

Immer dort, wo du auf dataGrid1 zugreifst.

herbivore

S
scharti84 Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

Das mit dem Invoke ist so eine Geschichte

hab des jetzt versucht

ich kann in der Methode writeProcess nich auf des invoke oder das beginnInvoke zugreifen!!!

mfg
Andreas

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo scharti84,

in TreeView von Thread aktualisieren lassen findest du ein Beispiel. Da es in diesem Beispiel kein Zugriffsproblem gibt, denke ich, dass es dir helfen müsste.

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren


private void WriteProcess (int pos, string ID, string Name, string Size )
		{
			if (this.InvokeRequired)
			{
				//Wenn jemand diese Methode aus dem falschen Thread aufruft, 
				//marshalle ihn in den richtigen Thread
				this.Invoke(new WriteProcessDelegate(this.WriteProcess),new object[]{pos,ID,Name,Size});
				return;
			}

			//Hier der ausführende Code
		}





	public delegate void WriteProcessDelegate(int pos, string ID, string Name, string Size );


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

257 Beiträge seit 2004
vor 18 Jahren

Du führst in deinem Programm folgende Bedingung aus:


if ( ds == null )
{
    ds.Tables.Add();
    ds.Tables[0].TableName = "Prozesse";
    ds.Tables[0].Columns.Add("ID");
    ds.Tables[0].Columns.Add("Prozess");
    ds.Tables[0].Columns.Add("Speicher");
}

In diesen Zeilen steckt ein ganz gravierender Fehler!

Du prüfst ob ds null ist. Danach versuchst du aber direkt auf die Methoden eines DataSet zu zugreifen ohne es zu instanziieren. Schliesslich ist ds ja null und nicht eine Instanz von einem DataSet.


if ( ds == null )
{
    ds = new DataSet(); // Diese Zeile einfügen um das DataSet zu instanziieren.
    ds.Tables.Add("Prozesse");
    ds.Tables[0].Columns.Add("ID");
    ds.Tables[0].Columns.Add("Prozess");
    ds.Tables[0].Columns.Add("Speicher");
}