2017-01-10 2 views
1

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?

+0

Wo deklarieren Sie 'o'? Alle Formulare müssen auf dem GUI-Thread sein. ShowDialog Blöcke. – LarsTech

+0

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. –

Antwort

1

Sind Sie sicher, dass osc und o zum Zeitpunkt des Fehlers die gleichen Abmessungen haben? Es scheint mir, dass sie das nicht tun. Also ist der Fehler nur darin.

Verwandte Themen