Zamykanie aplikacji jeśli jest już uruchomiona i wysyłanie przez sockety

0

Mam 2 pytania dotyczące programowania w C#

  1. Chciałbym zabezpieczyć program aby, jeżeli się go otworzy drugi raz, to wyświetli komunikat, że jest uruchomiony i się zamknie. Korzystam z mutexa. Jeżeli program uruchamia się, robię cośtakiego:

MessageBox.Show("Aplikacja jest już uruchomiona. Być może działa w trayu.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();

No i komunikat pojawia się wtedy kiedy trzeba, tyle że Application.Exit() jest zupełnie ignorowane i program wykonuje siędalej. Próbowąłem umieścićto i w OnActivate formy i konstruktorze i zawsze to samo. Czemu aplikacja się nie zamyka?

  1. Aplikacja ma wysyłać komunikaty i zadania między komputerami. Nie wiem jak rozwiązać następujące problemy z wysyłaniem. Mój podstawowy kod wysyłania (jak będzie trzeba to podam też funkcje z wątków):

for(int i=0;i<hosty[0].Count;i++)
                {

                    if (cbGrupaDocelowa.SelectedIndex == 0)
                        czy_wysłać = true;
                    else if (cbGrupaDocelowa.SelectedIndex == 1)
                        if (numery_hostów.Contains(i))
                            czy_wysłać = true;
                    if (hosty[1][i] == (string)cbGrupaDocelowa.SelectedItem)
                        czy_wysłać = true;
                    if (czy_wysłać)
                    {
                        lock (this)
                        {

                            TcpClient tcpClient = new TcpClient(hosty[2][i], ustawienia.port);

                            tcpClient.SendTimeout = 1;
                            tcpClient.ReceiveTimeout = 1;
                            NetworkStream ns = tcpClient.GetStream();
                            byte[] b = Encoding.UTF8.GetBytes("Otrzymano od: " + komunikat.od + " " + "Wysłano dnia: " + komunikat.kiedy_wysłano.ToString() + "\n\n" + komunikat.treść);
                            ns.Write(b, 0, b.Length);
                            tcpClient.Close();

                            //lista_wątków.Add(send);
                            czy_wysłać = false;
                        }
                    }
                }

No i mam takie problemy:

  1. Jeżeli np. poda się adres IP nieistniejącego hosta, to zanim pojawi się komunikat o błędzie mija bardzo dużo czasu i wtedy aplikacja się zawiesza. Próbowałem ustawić timeouty klienta TCP, ale to nic nie dało. Program ma działać w LANie więc nie potrzeba aż tak długiego okresu oczekiwania na odpowiedź. Jak to zmienić?

  2. Wydaje się, że wysyła się tylko do 1 hosta. Próbowąłem na razie wysyłać komunikaty do siebie i jak dam listę z 2 własnymi adresami IP, to mam tylko 1 komunikat. Jak poprawnie zrobić wysyłanie do wielu?

0

Application.Exit nie zamyka aplikacji w takim sensie że jest to kill procesu. To jest informacja że należy się zamknąć, ale wykonanie tego polecenia może chwilę zająć.
W którym dokładnie miejscu masz sprawdzenie?
Jeśli masz inny schemat, spróbuj z takim:
if (kolejna_instancja)
{
Message...
App.Exit()
}
else
{
Run(new Form())
}

0

A gdzie jest uruchamianie wątków? Może startują i zapobiegają zakończeniu głównego wątku?

0

Uruchamianie wątków jest dużo później (poza tym wszystkie są ustawione na isbackground = true). Aktualnie w konstruktorze.

0

Z 1 sobie poradziłem. Wstawiłem to do pliku program.cs i działa dobrze. Dzięki za podpowiedź, że mogę mieć w złym miejscu.

          Mutex mutex;
            bool createdNew = true;
            mutex = new Mutex(true, "OrganizerPracy", out createdNew);

            if (!createdNew)
            {

                MessageBox.Show("Aplikacja jest już uruchomiona. Być może działa w trayu.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
            else
                Application.Run(new frmOrganizerKlient());

2 problem aktualny dalej.

0

A na pewno masz dobrze logikę z ustawianiem wartości flagi czy_wysłać? Odpal debugger i zobacz co się dzieje, może po pierwszym przejściu kiedy ustawiana jest ta flaga na false w kolejnych nie przestawiasz jej na true.

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