Zdarzenia i ich obsługa

0

Witam, od jakiegoś czasu zaglądam na forum, a teraz przyszedł czas, żeby samemu o coś zapytać. Zajmuję się głównie programowaniem mikrokontrolerów w ANSI C, ale próbuję też swoich sił w c#.

Otóż walczę od kilku godzin ze zdarzeniami, może ktoś mógłby napisać, czy możliwa jest taka sytuacja żeby w procedurze zdarzenia Timer.Tick generować zdarzenie, które osługiwane byłoby w innych formularzach?

Konkretnie chodzi o to, że za pomocą Timer1 co kilka milisekund sprawdzam bufor kontrolki SerialPort. Jeśli coś jest, to pobieram i dalej obrabiam. Chciałbym, żeby w momencie kiedy przychodzi mi jakiś konkretny znak to w kilku innych formach programu generowane było zdarzenie, które informuje te formy, że nadeszły nowe dane.

Kombinuję z czymś takim - znalezione w jakichś internetowych kursach

 
public partial class Form1 : Form         //okno główne programu
    {
       Form2 window2 = new Form2();   //okno wywoływane przez okno główne
       Form3 window3 = new Form3();   //okno wywoływane przez okno główne

       public delegate void DelegatZdarzenia();
       public event DelegatZdarzenia Zdarzenie ;

        public Form1()
        {
            InitializeComponent();
            window2.Show();
            window3.Show();

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            //odbiór danych z SerialPort

            if (warunek)  // nadszedł jakiś konkretny znak
            {
                Wygeneruj zdarzenie;
            }
            
        }
    }

i okna otwierane przez program:

 
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            //Instalacja zdarzenia - dodanie uchwytu - nie bardzo wiem jak ?????
        }

        private void Alarm()    //uchwyt zdarzenia
        {
            MessageBox.Show("Nadeszły dane");

        }
    }

Mimo kombinacji nie bardzo mi wychodzi.
Czy to, co chciałbym uzyskac w ogóle jest możliwe, jeśli tak to jak powinienem to ugryźć?

Z góry dzięki za info.

0

ale dlaczego w timerze?? Przecież klasa SerialPort ma zdarzenie DataReceived które jest wołane po otrzymaniu danych. BTW masz świadomość, że timer nie jest w stanie "tikać" co kilka milisekund

0

Witam

W Timerze, bo nie zauważyłem w klasie zdarzenia DataReceived - cenna uwaga użycie zdarzenia wiele poprawi w kodzie.
Co do tikania co kilka milisekund to faktycznie zauwżyłem, że nawet jak ustawię 5 ms to tika znacznie rzadziej, miałem się tym zająć później.

Dzięki za cenne info, a co z tym generowaniem i obsługą zdarzenia ?

0

tutaj znacznie prościej będzie Ci utworzyć w obu formach (Form2 i Form3) publiczną metodę np. public void NewData(string Data); i w obsłudze zdarzenia DataReceived dać coś takiego
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
string data = ((SerialPort)sender).ReadExisting();
if (window2 != null)
window2.NewData(data);
if (window3 != null)
window3.NewData(data);
}

0

Właśnie coś podobnego teraz mam, tyle że pobieram do okien całe ramki danych (dlatego chciałbym, żeby po nadejściu znaku końca ramki generować zdarzenie.
Jest to o tyle probleatyczne, że użytkownik może decydować o tym jakie okna i ile sztuk ma być otwarte i teraz muszę bardzo pilnować, do których okien dostarczać dane, a do których nie. Można by tu jeszcze chyba użyć bloków "try" i próbować dostarczać dane do wszystkich okien (które istnieją) ale obsługa wyjątku jak zauważyłem też trochę trwa, a jakby wyjątków było zbyt wiele to wyszłyby pewnie jakieś przestoje programu.
Jakby każde okno samo sobie brało dane po zdarzeniu wygenerowanym w oknie głównym, to byłby ideał.

0

Handling and Raising Events (MSDN)

/* ========== Form1 ============ */

public delegate void DelegatZdarzenia(object sender, EventArgs e);
public event DelegatZdarzenia Zdarzenie;

/* ... */
//odbiór danych z SerialPort
if (warunek)  // nadszedł jakiś konkretny znak
{
    // Wygeneruj zdarzenie;
    Zdarzenie(this, EventArgs.Empty);
}

/* ========== Form2 ============ */
private Form1 form1;

public Form2(Form1 form1)
{
    InitializeComponent();
    this.form1 = form1;
    //Instalacja zdarzenia - dodanie uchwytu - nie bardzo wiem jak ?????
    form1.Zdarzenie += Alarm;
}

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    form1.Zdarzenie -= Alarm;
}

private void Alarm(object sender, EventArgs e)    //uchwyt zdarzenia
{
    MessageBox.Show("Nadeszły dane");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1