Laden...

Mehrere Forms in mehreren Threads

Erstellt von Tarion vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.663 Views
T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 12 Jahren
Mehrere Forms in mehreren Threads

Nabend,
ich habe eine Anwendung mit 2 Forms. In der einen läuft eine Uhr und im anderen ist ein DataGridView.

  • Der Grid beinhaltet Daten, die jede Sekunde aktualisiert werden.
  • Die Uhr bleibt einige Millisekunden stehen, wenn die Daten im anderen Form aktualisiert werden

Ich habe das Aktualisieren über gridView.InvalidateColumn() implementiert.

Es ändert sich jede Sekunde der Inhalt einer Spalte und abhängig vom Wert der Spalte wird die entsprechende Zeile gefärbt.

Das sieht mit InvalidateColumn alles super aus, bis auf die benötigte Zeit. Dadurch wird die Uhr in der anderen Form jede Sekunde kurz angehalten.

Eine Lösung wäre das Update schneller zu machen. Ich weiß nur nicht wie.

Oder ich lagere die Uhr Form in einen eigenen Thread aus. Hier die Frage: Ist das überhaupt möglich?

Edit:


void m_UpdateTimer_Tick(object sender, EventArgs e)
        {
			for (int i = 0; i < gridView.ColumnCount; i++)
			{
				gridView.InvalidateColumn(i);
			}
        }

Oder kann man die Kontrolle in jeder Iteration der Schleife einmal an die MainLoop der GUI zurück geben?

Gruß, Tarion

5.299 Beiträge seit 2008
vor 12 Jahren

ich hab nochnie mit InvalidateColumn gearbeitet, aber das sollte superschnell sein.

Es ist allerdings komisch, dass du es erst aufrufen mußt, denn wenn sich daten im grid ändern, invalidiert das automatisch die entsprechenden zellen.

Daher fürchte ich, dass du die Daten in einem anderen Thread änderst, und das ist keine gute idee, jdfs, wenn du Databinding verwendest.

Oder du machst iwas ganz unperformantes, wenn du die zellen einfärbst.

Der frühe Apfel fängt den Wurm.

T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 12 Jahren

Ich färbe in CellFormatting und hab da gerade noch Code gefunden der tatsächlich langsam sein könnte.

Die Daten aktualisieren das Form nicht, weil es sich um eine berechnete Property handelt die von der Zeit abhängt und daher kein OnPropertychange wirft.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Tarion,

grundsätzlich sollen alle Forms in einem Thread laufen. Und wenn das Update schnell genug ist, ist das ja auch kein Problem. Dass die Uhr ein paar Millisekunden stehen bleibt, kann dir immer passieren, selbst wenn du separate Threads verwenden würdest, weil auch Threadwechsel nur in bestimmten Zeitintervallen durchgeführt werden.

Wenn zwei Fenster in keiner (Owner-/Parent-)Beziehung zueinander stehen und auch sonst nicht aufeinander zugreifen, kann man jedes Fenster in einem eigenen Thread laufen lassen. Ohne guten Grund sollte man das aber nicht tun.

Um ein Fenster in einem eigenen Thread laufen zu lassen, muss man erst den Thread starten, dann darin das Fenster erzeugen und dann - ebenfalls in dem Thread - Application.Run aufrufen. Wie gesagt, das sollte man nie ohne guten Grund tun.

herbivore

T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 12 Jahren

Ich habe mein Problem jetzt gelöst. Beim Formatieren der Zellen wurde eine Liste mit mehreren Tausend Einträgen durchsucht. Das Ergebnis kann problemlos gecached werden.

Aber gut zu wissen, dass es theoretisch funktioniert. Ich glaube nicht, das die Limitierung der Threadwechsel zu Verzögerungen von >50ms Sekunden führen würde.

Mir fallen auch nicht viele Gründe ein, aber eine Uhr die möglichst genau laufen soll wäre schon nen guter Grund.