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
Hallo scharti84,
du musst Control.Invoke bzw. Control.BeginInvoke verwenden.
herbivore
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
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
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
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...
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");
}