Die übergabe von Daten zwischen threads in c#

Ich habe einige Fragen über mein problem, aber trotzdem, ich konnte nicht hande mit diesem auf meinem eigenen, so werde ich versuchen, die Frage hier. Ich werde fügen Sie den code so, ich denke, es wird einfacher sein, zu erklären.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Thread thread = new Thread(new ThreadStart(StartCalculation));
        thread.Start();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }


    public void StartCalculation()
    {
        List<int> numbers = new List<int>();
        for (int i = 0; i <= 100; i++)
        {
            numbers.Add(i);
            string textForLabel = i.ToString();
            label.SafeInvoke(d => d.Text = textForLabel);
        }

    }  
}
  • Ich möchte einen Zugang von der Methode StartCalculation die begann im anderen thread. Ich möchte Zugriff auf die int-Liste von Form1 (10 Elemente nach 10 Sek., 20 Elemente nach 20 Sekunden und so). Ist das möglich?
  • Würde erstellen einer Liste in Form1() und dann ändern Sie es in StartCalculation möglich sein?
    Vielen Dank für die Antworten 🙂

Bearbeitet für Groo- /-

public partial class Form1 : Form
{

List<int> list = new List<int>(); //list of int values from game's memory

public Form1()
{
    InitializeComponent();
    Thread thread = new Thread(new ThreadStart(refreshMemory));
    thread.Start();
    Thread thread2 = new Thread(new ThreadStart(checkMemory));
    thread2.Start();
}

private void Form1_Load(object sender, EventArgs e)
{
}

public void refreshMemory()
{        
    while (true)
    {
     //... refresh game's memory and then, refresh list //
    Thread.Sleep(100);
    }
}  

public void checkMemory()
{

    while (true)
    {
     //eg. if (list[0] == 5) {game:: move_right()}//
    Thread.Sleep(100);
    }

}  

}

Ich Spiel bot. Ich will es Lesen, Spiel-Speicher in einem anderen thread (ändern der Speicher-Liste), und dann, mit nur wenigen anderen Methoden (in verschiedenen threads), würde ich gerne Lesen aus dieser Liste und Spiel zu tun Aktionen abhängig von der Speicher-Werte. Es funktioniert (oder nur zu sein scheinen), aber wenn Du sagst, es könnte unsicher sein, würde ich mag, um es sicher.

Hoffe, ich habe keinen Narren aus mir einfügen hier.

  • Hier ist ein Buch: Threading in C#, Joseph Albahari
  • Gut, danke! Dank diesem Buch, es ist gelöst jetzt 🙂
  • "10 Elemente nach 10 Sek., 20 Elemente nach 20 Sek." - warum diese Verzögerungen? Was ist, wenn der Hintergrundthread erzeugt Elemente mit einer schnelleren rate? Oder sollte diese Arbeit als eine producer/consumer-Warteschlange, aber mit einer Schwelle von min. 10 items?
  • Gut, das war nur ein Beispiel. Ich bin eigentlich ein making-Programm das Lesen aus dem Spiel-Speicher. Ich werde eine Liste machen mit den Spiel Daten verfügbar für den ganzen das Programm, dann 1 thread aktualisieren/Aktualisierung der Liste und der 2. wird prolly überprüfen, ob es etwas zu tun im Spiel.
  • wenn Sie nicht ändern die Liste durch hinzufügen oder entfernen von Elementen (D. H. Ihre Länge zu ändern), einfach tauschen einen int Wert oder einen anderen Referenzwert erfolgt atomar und nicht durch sich selbst verursachen thread Fragen (in der Tat, jede Zuordnung mit einem 32-bit-oder kleineren Wert atomar ist in .NET). Aber Spiel loops sind in der Regel aus einem einzigen thread (read input -> berechnen der neuen Positionen -> check-Kollisionen -> render). Warum besteht Ihr auf mehrere threads?? Sie brauchen ein thread für die Schleife und die Verwendung des main (gui) thread für das rendering. Und abgesehen davon, haben Sie als XNA?
  • Nun gut, ich will haben Liste der Spiel-Speicher, die gibts, und fügen Sie Sie einmal in eine ganz bot-Schleife würde (meiner Meinung nach) nicht richtig funktioniert. Es ist auch einfacher, für die Verwendung von mehreren threads, von meinem Standpunkt aus einige. ZB, ich will meinen bot zu kontrollieren ist das Zeichen; (verschieben Nord-Ost-Süd-west) - shoudlnt werden, dass unabhängig von Heilung? Ich meine, wenn man low hp, spielt es keine Rolle, wo Sie wirklich stehen, die Sie brauchen, um zu heilen. Das ist, wie ich es sehe (könnte falsch sein tho :F). Nicht XNA für Spiele?. Ich möchte, dass Sie Antwort auf meinen post und sage, wenn mich nicht Irre. Danke!
  • p.s. was ist, wenn ich will hinzufügen/entfernen von Elementen aus der Liste? Könnte es possibble, dass ich diesen brauchen 🙁
  • Oh, jetzt verstehe ich es. Ich dachte, Sie machten ein Spiel. Und wie Holen Sie das Spiel memory-Daten, Lesen Sie Speicher im Besitz eines anderen Prozesses? Haben Sie behandelt diesen Teil schon? Es gibt verschiedene Möglichkeiten, dies zu tun. Was du gepostet hast, ist Recht einfach, je nach Komplexität der Logik, kann es ausreichend sein. Aber ich glaube immer noch, dass dein thread wecken können, Holen sich die Speicher -, Prozess -, und gehen Sie zurück zu schlafen in einer einzelnen iteration. Ich kann nach einer anderen Antwort mit einige Muster später, jetzt bin ich geringfügig beschäftigt.
  • ok, ich freu mich für Deine Antwort! 😛 @Prozess-Speicher - ja, ich habe gehandhabt, dass ein Teil bereits und arbeitet veri nice 😛 (danke für die Sorge !) 🙂

InformationsquelleAutor Patryk | 2012-01-25
Schreibe einen Kommentar