Forum: PC-Programmierung Eventfunktion aufrufen


von Christoph B. (Gast)


Lesenswert?

Ich weiß es nicht die saubere Art zu programmieren.


Für einen Vorführung/Test würde ich aber gerne eine (Event-Funktion)

aufrufen

Hier die Funktion:
1
private void livebildStartToolStripMenuItem_Click(object sender, EventArgs e)

ich habe jetzt schon mit Funktion(null, null) als Übergabeparameter 
versucht die Funktion aufzurufen und mit Funktion(null, EventArgs 
MyEvent)

Der Timer in der Funktion fängt aber leider nicht an zu laufen

Inhalt der Funktion
1
{
2
startTimer.Interval = 1000;
3
                   startTimer.Enabled = true;
4
                   startTimer.Tick += new EventHandler(TimerEvent1);
5
}
Wenn ich auf den Tool Strip klicke geht es aber das ist ja klar.

Wie muss ich denn die Funktion aufrufen, dass es geht?

Danke
Chris

von frsc (Gast)


Lesenswert?

vielleicht so? (nicht getestet):
1
livebildStartToolStripMenuItem_Click(new object, new EventArgs)

von Borislav B. (boris_b)


Lesenswert?

Wenn du die Parameter in der Funktion nicht verwendest, solltest du 
natürlich auch null übergeben können.

Und du bist sicher (Debugger!) dass du in die Methode reinläufst???

von Christoph B. (Gast)


Lesenswert?

Nein ich glaube nicht dass das TimeEvent1 aufgerufen wird.

TimeEvent1 habe ich gedebugged und ich komme nicht zu dem Haltepunkt.

Warum das aber nicht aufgerufen wird habe ich noch nicht verstanden!


Liegt das an dem += das es nicht geht?

von Christoph B. (Gast)


Lesenswert?

ZUSATZ:

Die Funktion wird aber aufgerufen, nur dann geht es nicht weiter

von Borislav B. (boris_b)


Lesenswert?

Ich habs hier mal schnell nachprogrammiert, und es funktioniert 
einwandfrei.
=> Ich vermute mal dein Fehler liegt wo anders...

von Dave B. (gaston)


Lesenswert?

Gerade Click-Events von Schaltflächen kann man super programmatisch 
auslösen:
1
livebildStartToolStripMenuItem.PerformClick();

Eventuell lohnt es sich auch schon das Timer-Event schon eher zu 
zuordnen, z.B. bei der Initialisierung. So wird nur einmalig ein 
Eventhandler dem Timer-Event zugewiesen.
Der Timer sollte dabei aber schon erstmal disabled sein. Über die 
Schaltfläche wird er dann nur aktiviert.
1
...
2
//init
3
startTimer.Enabled = false;
4
startTimer.Tick += new EventHandler(TimerEvent1);
5
...
6
//onClick
7
private void livebildStartToolStripMenuItem_Click(object sender, EventArgs e)
8
{
9
      startTimer.Interval = 1000;
10
      startTimer.Enabled = true;
11
}
12
...
13
//Button und Timer auslösen
14
livebildStartToolStripMenuItem.PerformClick(); //löst Click-Event aus
15
...
16
//Timer
17
private void TimerEvent(object sender, EventArgs e)
18
{
19
       StartTimer.Enabled = false; //Timer aus damit nicht nochmal feuert
20
       //Timeraktionen
21
       ...
22
       StartTimer.Enabled = true; // Timer soll weiterlaufen
23
}

von Christoph B. (Gast)


Lesenswert?

Da bekomme ich dann eine Fehlermeldung

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das 
Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem 
Thread, für den es erstellt wurde.

von Borislav B. (boris_b)


Lesenswert?

Um nochmal auf deine Ursprungssituation zurückzukommen:

Der Code, der den Timer startet wird aufgerufen?
Nur der Callbackd es Timers dann nicht mehr?

Kannst du das bitte nochmal beides sicherstellen?

von Christoph B. (Gast)


Lesenswert?

1
 
2
        private void livebildStartToolStripMenuItem_Click(object sender, EventArgs e)
3
        {
4
            
5
            
6
            if (toolStripMenuItem2.Checked == true)
7
            {
8
9
10
11
                DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.OKCancel);
12
                if (dialogResult == DialogResult.Cancel)
13
                {
14
                    return;
15
                }
16
                else
17
                {
18
                    //StartTakingPicture();
19
20
                    startTimer.Interval = 1000;
21
                   startTimer.Enabled = true;
22
                   //startTimer.Tick += new EventHandler(TimerEvent1);
23
24
25
26
                }
27
            }
28
            else
29
            {
30
31
                formsTimer.Enabled = true;
32
                //formsTimer.Tick += new EventHandler(TimerEvent);
33
34
            }
35
        }

Diese Funktion möchte ich aufrufen, oder auf den Button klicken

von Borislav B. (boris_b)


Lesenswert?

Ist ja wie gesagt kein Problem:
1
livebildStartToolStripMenuItem_Click(null, null);

von Christoph B. (Gast)


Lesenswert?

Das geht aber nicht nur wenn ich den Button drückt (Maus) wird nach der 
Messagebox die man mit ok bestätigen muss der Timer aktiviert

Beim Aufruf passt nach der Messagebox nicht.

Ich versteh aber gar nicht warum

von Quorki (Gast)


Lesenswert?

Was sagt denn in dem Fall der Debugger über den Timer?
Ist er richtig aufgesetzt und läuft?

von Dave B. (gaston)


Lesenswert?

Der Click Aufruf sollte wohl vom Hauptanwendungs/GUI-Thread kommen und 
nicht von anderen Threads/Backgroundworkern.

Schreib doch eine probeweise eine 2te Funktion die genau dasselbe macht 
wie der Button-Click, halt nicht als Eventhandler (sender und e wird ja 
eh nicht genutzt):
1
 
2
        private void Fkt_statt_Button()
3
        {
4
            
5
            //ggf. if-rahmen auskommentieren
6
            if (toolStripMenuItem2.Checked == true) //zugriff auf gui element?
7
            {
8
                //Anfang interessanter teil
9
                DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.OKCancel);
10
                if (dialogResult == DialogResult.Cancel)
11
                {
12
                    return;
13
                }
14
                else
15
                {
16
                    //StartTakingPicture();
17
18
                    startTimer.Interval = 1000;
19
                   startTimer.Enabled = true;
20
                   //startTimer.Tick += new EventHandler(TimerEvent1);
21
                }
22
                //Ende interessanter Teil
23
            }
24
            else
25
            {
26
27
                formsTimer.Enabled = true;
28
                //formsTimer.Tick += new EventHandler(TimerEvent);
29
30
            }
31
        }

Was schon gut ist, ist das du die Tick-Eventhandler schon mal vorher 
zugewiesen hast. Die Sollten sich ja nicht dauernd ändern und die Timer 
existieren ja eh schon.
Scharf geschalten werden sie ja über
1
*.Enabled = true;
 und dementsprechend auch wieder abgeschalten deaktiviert.

Die Warnung zum Thread-Übergriff ist natürlich spannend. Ist natürlich 
die Frage von wo du denn den "Click" auslösen willst, wenn das jetzt eh 
nur zum Testen ist dann ruf den doch gleich zum Abschluss des 
Constructors auf.
Form geht auf und als letzte Aktion wird halt der "Click" aufgerufen.

Wenn von anderen Threads aus dann geht die ganze Callback- und 
Invoke-Geschichte los.

von Christoph B. (Gast)


Lesenswert?

1
private void StartTimer()
2
        {
3
            testTimer.Interval = 1000;
4
            testTimer.Enabled = true;
5
            testTimer.Tick += new EventHandler(TimerEvent2);
6
        }
7
8
        private void TimerEvent2(object sender, EventArgs myEventArgs2)
9
        {
10
            int v = 0;
11
            v++;
12
13
            toolStripStatusLabel11.Text = v.ToString();
14
15
        }

ich habe jetzt mal testweise eine zweite Funktion aufgesetzt und 
gedebugged. Die Die Funktion StartTimer() wird aufgerufen.

Allerdings wird denn die TimerEvent2 Funktion nicht aufgerufen, was 
meiner Meinung nach aber schon passieren sollte.

von bluppdidupp (Gast)


Lesenswert?

> Die Funktion StartTimer() wird aufgerufen.
...auch vom UI-Thread aus?

von Borislav B. (boris_b)


Lesenswert?

Was macht eigentlich deine Timer-Funktion? Greift die auf das GUI zu?

EDIT:
Ah, da oben stehts ja. Du greifst tatsächlich auf das GUI zu ;-)
Das ist natürlich nicht erlaubt, und sollte eine Cross-Thread Exception 
auslösen.
Die müsstest du dann ja eigentlich auch bekommen? Oder hast du irgendwo 
ein Try-Catch-All-DoNothing-Block drum rum gebaut?

von Christoph B. (Gast)


Lesenswert?

Christoph B. schrieb:
> Da bekomme ich dann eine Fehlermeldung
>
> Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
> Steuerelement menuStrip1 erfolgte von einem anderen Thread als dem
> Thread, für den es erstellt wurde.

Ja hier habe ich die Fehlermeldung kommentiert.

von Sven (Gast)


Lesenswert?

Ich möchte diesen Kommentar nochmal aufgreifen und ich habe das mal 
ausprobiert.
Das geht auch nicht!!!

von Manu (Gast)


Lesenswert?

Christoph B. schrieb:
> private void livebildStartToolStripMenuItem_Click(object sender,
> EventArgs e)
>         {
>
>
>             if (toolStripMenuItem2.Checked == true)
>             {
>
>                 DialogResult dialogResult = MessageBox.Show("Sure",
> "Some Title", MessageBoxButtons.OKCancel);
>                 if (dialogResult == DialogResult.Cancel)
>                 {
>                     return;
>                 }
>                 else
>                 {
>                     //StartTakingPicture();
>
>                     startTimer.Interval = 1000;
>                    startTimer.Enabled = true;
>                    //startTimer.Tick += new EventHandler(TimerEvent1);
>
                 }
           }
            else
            {

                 formsTimer.Enabled = true;
                //formsTimer.Tick += new EventHandler(TimerEvent);

            }         }
 Diese Funktion möchte ich aufrufen, oder auf den Button klicken

Weiß jemand inzwischen wie man den Timer in der Funktion nach dem diese 
Aufgerufen wurde zum laufen bringt (Die Funktion wird bei mir per 
ReceiveData aufgerufen und nicht über die GUI). Deshalb läuft glaube ich 
der Timer nicht los... some ideas???

von Manu (Gast)


Lesenswert?

Hat sich glaube ich erledigt!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.