Danke für die Beschreibung zum posten von Code. Muss ich gleich mal testen.
Aber ich meinte mit Länge des Codes, die mehrfache Verschachtelung von Klassen...
Ich habe mal das Wesentliche herauskopiert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| namespace StepSequencer.MIDI.Classes { public class ExtendedMidiClock { public ExtendedMidiClock() { MidiClock.Tick += new EventHandler(MidiClock_Tick); }
public MidiInternalClock MidiClock = new MidiInternalClock();
public void MidiClock_Tick(object sender, EventArgs e) { #region Generate Pattern Tick
switch (patternChanged) { case true: if (Tick_Pattern != null) { Tick_Pattern(this, e); } patternChanged = false; break; case false: break; }
#endregion
....
overallTickCounter++;
switch ((overallTickCounter % ticksPerStep) == 0) { .... (eigentliche Logik) patternChanged = true; } }
....
public event EventHandler<EventArgs> Tick_Pattern;
.... } } |
Das ist die Klasse des Timers. Grundlage ist der "MidiInternalClock" Timer von Leslie Sanford. Dieser basiert auf einem System.Timer. (An dieser Stelle nochmal ein dickes Danke an Leslie, für das großartige C# Midi-Toolkit!!)
Und nun als Testform:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| namespace StepSequencer { public partial class Sequencer : Form { MIDI.Classes.ExtendedMidiClock XMClock = new StepSequencer.MIDI.Classes.ExtendedMidiClock();
public Sequencer() { InitializeComponent();
XMClock.Tick_Pattern += new EventHandler(ExtndMidiClock_Tick_Pattern);
}
public void ExtndMidiClock_Tick_Pattern(object sender, EventArgs e) { textBox1.Text = "asda"; }
private void button1_MouseDown(object sender, MouseEventArgs e) { XMClock.Start(); }
private void button1_MouseUp(object sender, MouseEventArgs e) { XMClock.Stop(); } } } |
Letztendlich soll der Timer eine "MIDI-Clock" darstellen. Also ein Timer, der zur Synchronisierung von "Musikereignissen" benötigt wird.
Zitat: |
Nein, Ereignisse sind dazu da, dass nicht der Programmierer steuert, wann etwas geschieht, sondern der Anwender. Das hat überhaupt nichts mit Threads bzw. Thread-Unabhängigkeit zu tun.
|
Ja, nicht direkt. Aber ich dachte, dass das Benutzen von Events, ein Multithreading "unnötig" macht.
Im Sinne von: "Nutze Events, und du brauchst dich nicht mit Multithreading auseinandersetzen..."
Zumindest noch nicht hier. Da es sich um eine Musiksoftware handelt, überlege ich, jegliche GUI Methoden per Multithreading zu realisieren... Während sich die GUI aktualisiert, darf der eigentliche Thread nicht unterbrochen werden. Aber alles zur GUI kommt später...
Damit dürfte auch deine nächste Frage beantwortet sein. Eigentlich möchte ich zur Zeit nur einen Thread "bedienen".
Der von mir geschriebene Timer soll instanziert werden können, und dem Hauptthread dann zur Verfügung stehen. Also auch in ihm abgearbeitet werden.
Eigentlich ist es mir sogar wichtig, das die verschiedenen Tickereignisse meines Timers nacheinander erledigt werden!
In dem Code oben, habe ich nur ein Event. Die anderen sind identisch aufgebaut, werden nur zu verschiedenen Zeiten gestartet.
Ein Multithreading an dieser Stelle, würde das gesamte Programm instabil werden lassen.
Zur Zeit verstehe ich ja nicht, warum mein Timer in einem eigenen Thread behandelt wird. Ich rufe, zumindest bewusst, an keiner Stelle einen weiteren Thread auf.
Oder wird durch ein Event, automatisch ein neuer Thread gestartet?
Ich merke schon, ich muss mich unbedingt mal genauer durch das Thema Threading einarbeiten...
Ich hoffe, dass Problem ist nun ein wenig anschaulicher.
Vielleicht noch zur Ergänzung:
In dem Beispiel habe ich die Methoden zum Verändern der Textbox in Form1 eingebaut.
Letztendlich wird der Timer aber in Klassen eingebaut, welche wiederum instanziert werden. Zum Beispiel soll es 5 Klassen geben, welche jede unabhängigen Timer hat. Diese Klassen können dann gerne in jeweils einzelnen Threads abgearbeitet werden. Doch inwiefern das Sinn macht, kann ich noch nicht sagen...
Die Timer müssen aber jeweils im Thread der instanzierenden Klasse abgearbeitet werden!
Ich hoffe, du verstehst was ich meine.
Nochmal danke für deine Bemühungen an einem Ostersonntag!!