Eventfunktion aufrufen

Gast #3236185
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
Gast #3236364
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?
#3236451
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
}
Gast #3236739
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.
Gast #3236761
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
Gast #3236815
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
#3237819
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.
Gast #3239993
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.
#3240942
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?
Gast #3243520
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???

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren