Ich schreibe eine Software, wo ich N Formulare erstellen und sie in Echtzeit von einer Anwendungskonsole aktualisieren muss.Starten Sie mehrere und parallele Formulare und aktualisieren Sie sie in C#
poste ich hier ein Beispiel:
//THE DIMENSION OF o IS VARIABLE, IT CAN RANGE FROM 0 TO 5
//o LENGTH DEFINE HOW MANY PARALLEL FROMS MUST BE LAUNCHED AND o CONTENT DEFINE THE FORM TITLE
//osc IS A List<Osci>
public void read()
{
//Create N thread
Thread[] oscThread = new Thread[o.Length];
for(int i = 0;i<o.Length; i++)
{
oscThread[i] = new Thread(new ThreadStart(OsciThreadProc));
oscThread[i].Start();
osc[i].setTitle("form n. " + o[i]);
}
//loop until the thread must be alive
while (!suspendThread)
{
//HERE I GET A NEW LINE OF MY RAW DATA
rawData myTemporaryRaw = getRawData();
//HERE I RETURN THE DATA ANALYZED
int[] data = AnalyzeRaw(myTemporaryRaw);
//UPDATE FORM CONTENT
//O CONTENT MATCH WITH Data VALUE
for(int j = 0; j < o.Length; j++)
{
osc[j].Draw(data[o[j]]);
}
}
}
private void OsciThreadProc()
{
var myOsc = new Osci();
osc.Add(myOsc);
myOsc.ShowDialog();
}
Es ist eine Konsolenanwendung (hier der Einfachheit halber habe ich nur ein paar Methoden geschrieben), die n Formen und aktualisieren Sie sie mit einem Fluss von Inhalten starten müssen.
Der Formularcode ist:
//THIS FORM HAS ONLY A LABEL valueLabel
public partial class Oscilloscope : Form
{
public Osci()
{
InitializeComponent();
}
public Osci(int c)
{
InitializeComponent();
}
private void Osci_Load(object sender, EventArgs e)
{
}
internal void setTitle(string title)
{
Text = title;
}
internal void Draw(int v)
{
valueLabel.Text = v.ToString();
}
}
Als ich dieses Programm zu starten, ist es eine Ausnahme starten ('System.ArgumentOutOfRangeException'
) auf osc[i].setTitle("form n. " + o[i]);
. Wahrscheinlich versucht es, den neuen Wert zu bekommen, der in der zweiten Methode vor der ersten Methode ausgeführt wird.
Wie auch immer, ich denke auch, dass mein Weg nicht der beste Weg ist, um parallele Formulare zu starten und sie mit einem Informationsfluss zu aktualisieren.
Kannst du mir einen besseren Weg bieten?
Wo deklarieren Sie 'o'? Alle Formulare müssen auf dem GUI-Thread sein. ShowDialog Blöcke. – LarsTech
Es ist problematisch, globale Daten wie 'osc' zu haben und mehrere Threads darauf zugreifen zu lassen. Machen Sie besser einen Vektor von Objekten, von denen jeder einen Thread besitzt, und haben Sie jeweils eigene Daten. In deinem Fall hat der Thread den Abschnitt 'osc.Add (myOsc); 'nicht beendet, während dein Haupt-Thread bereits versucht, auf den neuen' osci 'zuzugreifen. –