Czyszczenie wątków, przy zamknieciu aplikacji.

0

Jak w temacie. W jaki sposób, wyczyścić wątki przy wyłączeniu aplikacji.

0

yyyy no normalnie je zakończyć?

0
  1. Odpowiada się W POSTACH a nie KOMENTARZACH!
  2. Problem należy opisać DOKŁADNIE i ZROZUMIALE a nie na odczep
  3. Co ma wspólnego wątek zamykanej aplikacji do tego co po RS232 przychodzi?
0

Myślałem, że moje pytanie jest dość jasne. Mam napisaną aplikacje, która obsługuje przychodzące bytes przez SerialPort. Program działa odbiera dane liczy sobie itp. Lecz po wyłączeniu go i ponownym włączeniu program się wiesza. To znaczy albo przychodzą jakieś bytes, które nie zostały nawet wywołane albo się zawiesza całkowicie. Aby móc odpalić program jeszcze raz muszę odłączyć Port USB i ponownie go podłączyć. Sumą summarum wychodzi na to, że muszę wyczyścić wszystkie wątki. Znalazłem odpowiedz w postaci metody:
Environment.Exit()
Zostaje pyanie gdzie ją umieści, aby przy wyłączeniu programu się wykonywała.

2

ale wątki tu nie mają NIC DO RZECZY! Jak zamkniesz program I NIE WISI on w menadżerze zadań to znaczy, że WSZYSTKIE jego wątki zostały zakończone (czy normalnie czy ubite na chama to zależy od tego jak są napisane). To, że program coś odczytuje z RSa po uruchomieniu to znaczy, że coś tam jest. To, że program się zawiesza po uruchomieniu oznacza, że nie bardzo wiesz co robisz bo nawet debuggera użyć nie potrafisz.

Możesz np. dać kod i opisać na jakiej zasadzie coś się na RSie pojawia (czy najpierw program musi wysłać "żądanie" czy "urządzenie" po drugiej stronie śle samo z siebie)

0

Witam,

Może pokaż jak obsługujesz wątek który odpowiedzialny jest za komunikację po porcie szeregowym. Może zamykasz wątek GUI a nie informujesz o tym wątku odpowiedzialnego za port szeregowy i czekasz że GC zajmie się właściwym obsłużeniem tego procesu.

Pozdrawiam,

mr-owl

0

Wygląda to mniej więcej tak:

public class KlasaObslugiUSB : IDisposable
    {
        // Dane
        private static KlasaObslugiUSB instancjaObiektu;
        private static readonly object instancjaLock = new object();
        private SerialPort PortUsb = new SerialPort();
        private event EventHandler _zdarzenie;
        private bool _flaga;

        // Właściwości danych
        public static KlasaObslugiUSB Instancja
        {
            get
            {
                if (instancjaObiektu == null)
                {
                    lock (instancjaLock)
                    {
                        if (instancjaObiektu == null)
                        {
                            instancjaObiektu = new KlasaObslugiUSB();
                        }
                    }
                }
                return instancjaObiektu;
            }
        }
        public byte[] Dane { get; set; }
        public event EventHandler Zdarzenie
        {
            add { _zdarzenie += value; }
            remove { _zdarzenie -= value; }
        }
        protected void WykonajZdarzenie(EventArgs e)
        {
            _zdarzenie?.Invoke(this, e);
        }
        public bool Flaga
        {
            get { return _flaga; }
            set
            {
                if (_flaga != value)
                {
                    _flaga = value;
                    WykonajZdarzenie(new EventArgs());
                }
            }
        }

        // Ciało klasy
        public KlasaObslugiUSB()
        {
            PortUsb.PortName = "COM10";
            PortUsb.BaudRate = 115200;
            PortUsb.Handshake = Handshake.None;
            PortUsb.Parity = Parity.None;
            PortUsb.DataBits = 8;
            PortUsb.StopBits = StopBits.One;
            PortUsb.RtsEnable = true;
            PortUsb.DtrEnable = true;

            PortUsb.DataReceived += new SerialDataReceivedEventHandler(CzytanieBytes);
        }

        // Metoda sumująca wyniki
        public void Open()
        {
            PortUsb.Open();
        }
        public bool IsOpen
        {
            get { return PortUsb.IsOpen; }
        }
        private void CzytanieBytes(object sender, SerialDataReceivedEventArgs e)
        {
            Flaga = false;

            if (!PortUsb.IsOpen) return;
            int iloscBytesDoSkopiowania = PortUsb.BytesToRead;
            Dane = new byte[iloscBytesDoSkopiowania];
            PortUsb.Read(Dane, 0, iloscBytesDoSkopiowania);

            Flaga = true;
        }
        public void Dispose()
        {
            PortUsb.Close();
        }
        public void SygnalA()
        {
            if (PortUsb.IsOpen)
            {
                PortUsb.Write(new byte[] { 65 }, 0, 1);
            }
        }
    }
0

no a gdzie ten wątek?
i oczywiście sprawdziłeś, w którym miejscu się aplikacja zawiesza przy starcie

0

Witam,

To może zrób to po "bożemu" i nie oczekuj że GC zamknie za ciebie port. Ogólnie wyrzuciłbym 3/4 z tego kodu co tam cudownie stworzyłeś.

Pozdrawiam,

mr-owl

0

W debugu wyskakuje mi tylko Exception thrown: 'System.ArgumentOutOfRangeException' in mscorlib.dll i nic poza tym nie widać. Wątek jest bardzo rozbudowany i bez sensu jest żebym go tu wstawiał. Tak jak napisał mr-owl, wnioskuje że to właśnie chodzi o to zamkniecie GUI. Tylko nadal nie wiem jak to zrobić właśnie po Bożemu?

0

no ale co Ci mamy powiedzieć jak nie dałeś żadnego kodu.

Co do debbugera to odpal spod IDE w trybie debug to się dowiesz, która linijka się wysypuje. Jak wysypuje się wątek to daj breakpointa na starcie i przejdź krok po kroku.

0

Gdybym miał błąd w debugu to bym się nim pochwalił, i raczej bym wiedział gdzie szukać odpowiedzi. Problem w tym, że skoro zaznaczam breakpointa na buttonie(inne butony działają) i po wciśnięciu tego buttona nawet nie dochodzi do tego breakpointa tylko GUI się wiesza i nie da się nic z tym zrobić, to musi być coś ostro nie tak. Skoro nie ma błędów pytam o wiedze teoretyczną a nie praktyczną. Czy ktoś na forum miał styczność z takim problem. I czy jest jakieś logiczne rozwiązanie tego zagadnienia. Czyszczenie portu wydało mi się dość dobrym tropem, lecz nie wiem w jaki sposób dokładnie to zrobić. Jaką metodą i czy mogę np. ją wykonać od razu po odebraniu danych?

0

Witam,

Może prześlij cały kod swojego programu bo widząc "radosną twórczość" można się spodziewać różnych kwiatuszków...

Pozdrawiam,

mr-owl

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