Laden...

Events werden nicht abnnoiert... Aber warum?

Erstellt von mipa_acc vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.088 Views
M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 16 Jahren
Events werden nicht abnnoiert... Aber warum?

Hallo,

ich Sitze nun schon seit einer Weile an einem seltsamen Problem...

Folgender Sachverhalt: Ich hab eine Klasse. Diese soll bescheid geben wenn etwas in einer Liste durchgelaufen ist. Hier mal der Code meiner "Sender" Klasse:


public class LedToucher {

		public delegate void SequenzPassDelegate();
		public event SequenzPassDelegate SequenzPassEvent;

		public delegate void SequenzFinishDelegate();
		public event SequenzFinishDelegate SequenzFinishEvent;

		public LedToucher() {



		}

		public void StartTouching(bool endless) {

			_LedToucherThread = new Thread(new ThreadStart(TouchLedModule));
			_LedToucherThread.Start();
			
			_StopCurrentTouching = endless;

		}

		private void TouchLedModule() {

			SequenzPassEvent = new SequenzPassDelegate(TouchLedModule);

			//Do-While, damit die Sequenz mindestens einmal durchläuft.
			//falls man unendlich will check die schleift das zum Schluss ab.
			do {

				foreach (SequenzStep currentStep in _Sequenz.SequenzStepCollection) {

					if (open_port() == 1) {

						//TouchLedModule();
						write_port(currentStep.Value);
						System.Threading.Thread.Sleep(currentStep.ActiveTime);

					} else {

						MessageBox.Show("Der Treiber wurde noch nicht gestartet. Bitte Treiber \"giveio\" starten.",
							"LedBrowser", MessageBoxButtons.OK, MessageBoxIcon.Error);

						break;
					}
				}

				//Event werfen, dass die Sequenz durchgelaufen ist.	
				if(SequenzPassEvent != null) {
				
					SequenzPassEvent.Invoke();				
				
				}

			} while (_StopCurrentTouching == true);

						
			//Event werfen, damit in der MainForm der Startbutten wieder aktiviert werden kann
			SequenzFinishEvent.Invoke();

		}

}

Das der Event von einem Separatem Thread aus aufgerufen wird sollte ja egal sein.

Hier ist ein Kleiner Teil meiner Main Klasse. Wie man sieht abboniere ich im Konstruktor die Event´s. Leider tut sich da nie was. Bin wirklich schon am verzweifeln und hab auch schon viel Probiert, aber ich kann es einfach nicht verstehehn, warum mein Programm nie in die entsprechenden Methoden (_MyLedToucher_SequenzFinishEvent), (_MyLedToucher_SequenzPassEvent) springt.

Hier der Code meiner Main Klasse:


public partial class MainForm : Form {

private LedToucher _MyLedToucher; 

public MainForm() {

			//Events von LedToucher Abonnieren
			_MyLedToucher = new LedToucher();
			//Event tritt ein, wenn der Toucher mit einer Sequenz fertig ist (und dann nicht mehr wiederholt)
			_MyLedToucher.SequenzFinishEvent += new LedToucher.SequenzFinishDelegate(_MyLedToucher_SequenzFinishEvent);

			//Event tritt auf, wenn eine Sequent komplett durchlaufen ist.
			_MyLedToucher.SequenzPassEvent += new LedToucher.SequenzPassDelegate(_MyLedToucher_SequenzPassEvent);

}

		public void _MyLedToucher_SequenzFinishEvent() {


		}

		public void _MyLedToucher_SequenzPassEvent() {
			//Dieser Event tritt ein, wenn die Sequenz einmal durchlaufen ist.
			//Falls sie endlos laufen soll passiert nichts, andern falls 
			//wird der Startbutton wieder enabled

			if (endlessListRunToolStripButton.Checked == false) {

				startPreviewToolStripButton.Enabled = true;

			}
		}

}

Bitte um einen kleinen Denkanstoß.

Vielen Dank im Vorraus

MFG mipa_acc

1.378 Beiträge seit 2006
vor 16 Jahren

Hallo mipa_cc,

ich denke der Fehler liegt in der Art wie du versuchst das Event zu feuern:

Statt:

SequenzPassEvent = new SequenzPassDelegate(TouchLedModule);
//Event werfen, damit in der MainForm der Startbutten wieder aktiviert werden kann
SequenzFinishEvent.Invoke();

solltest du mal folgende Zeile probieren(dort wo geworfen werden soll)


if(SequenzFinishEvent!=null)
  SequenzFinishEvent();

Deine Variante ein Event anzulegen und zu feuern habe ich noch nie gesehen und vermute ich daher auch das dort der Fehler liegt.

Lg XXX

343 Beiträge seit 2007
vor 16 Jahren

Ich hab den Code zwar nur überflogen aber ich frage mich was die erste Zeile in TouchLedModule() da macht?

SequenzPassEvent = new SequenzPassDelegate(TouchLedModule);

Ich bin mir jetzt zwar nicht sicher, aber dass deine Methoden aus der Main-Klasse nicht aufgerufen werden, könnte sein weil du dein event quasi überschreibst, bevor du es dann verwendest.
Lösch die Zeile mal raus und probiers nochmal.

An dem was xxxprod sagt könnte auch was dran sein, so einen Aufruf hab ich auch noch nie gesehen (was nicht heißen soll dass er automatisch falsch ist -> aber es könnte sein)

Lg
Preli

[- www.saftware.net -](http://www.saftware.net/)
49.485 Beiträge seit 2005
vor 16 Jahren

Hallo mipa_acc,

siehe auch [FAQ] Eigenen Event definieren / Information zu Events

herbivore

M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 16 Jahren

Hallo Männer,

vielen Dank für eure Tipp´s jetzt funktioniert´s auch!

MFG