Dwa procesy jednocześnie – wysyłanie danych między programami

0

Cześć, napisałem sobie w c# w konsoli komunikator przez SQL, i trafiłem na pewien problem, ponieważ chciałbym aby sam pobierał i wyświetlał wiadomości. wsadziłem więc po prostu w pętle łączenie się z bazą, pobieranie wiadomości i wyświetlanie ich, jeśli ich nie ma to czeka 3 sekundy. Tylko że w ten sposób musiałem rozdzielić swój program na dwa, aby jeden w pętli wyświetlał, a z drugiego można było pisać. Rozwiązanie działa, ale jest niewygodne i nieeleganckie, chociażby dla tego, że trzeba się logować osobno do skrzynki odbiorczej i nadawczej.

  1. Czy jest inne rozwiązanie? zamierzam teraz napisać ten program "okienkowo" i przy tym rozwiązać te problemy.

  2. Mój program co 3 sekundy łączy się z bazą danych, pobiera wiadomości zaadresowane do niego, wyświetla je, i usuwa z bazy danych, zamyka połączenie, czeka
    3 sekundy, łączy się znowu. czy to jest optymalne rozwiązanie? Czy może powinienem się raz połączyć z bazą na cały czas działania programu i tylko wysyłać nowe zapytania?

  3. Czy programy między sobą mogą się wymieniać danymi? w 1. programie się loguję, on odpala mi drugiego .exe w którym znowu muszę się zalogować, wystarczyło by, aby 1. program wysłał do drugiego wprowadzony login. Teraz wpadłem na to, że można informację o logowaniu zapisać do .txt, drugi program sobie to odczyta i usunie plik. istnieje metoda która wysyła zmienne bezpośrednio?

Dziękuję i życzę miłego dnia ;)

1

Jak chcesz mieć jeden program to użyj wątków. Jak chcesz uruchamiać ten drugi proces (program) z tego pierwszego i przekazać mu argumenty to użyj klasy System.Diagnostic.Process. Są jeszcze inne sposoby ale to powinno Ci wystarczyć

2

Program oparty na bezpośrednim łączeniu się do bazy SQL to nie jest dobry pomysł, główny problem to to, że ciężko jest taką publicznie dostępną bazę dobrze zabezpieczyć, zazwyczaj w takiej sytuacji wystawia się jakieś API. Natomiast w tym przypadku łatwo możesz zrobić serwer oparty na bibliotece SignalR, która służy właśnie do przesyłania wiadomości w czasie rzeczywistym. Nie musisz wtedy pollować serwera dla sprawdzenia czy przyszły wiadomości, bo przychodzą same :)

0

Ok, czaje jak zastosować nowy wątek dla jakiejś funkcji z np. pętlą. Chciałbym aby kliknięcie buttona albo opcji z listy, odpalało mi nowy form w nowym wątku, póki co mam form1 który pełni rolę menu z kontaktami, po wybraniu z listy i zatwierdzeniu otwiera się nowy form <rozmowa>, ale nie mogę go schować i z menu otworzyć następnego, muszę najpierw zamknąć aktualne okno. Jak to rozwiązać?

w ten sposób po wybraniu dwuklikiem z listy tworzę nowy formularz

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (listBox1.SelectedItem != null)
            {

                rozmowa r = new rozmowa();
                r.label1.Text = "Rozmowa z " + listBox1.SelectedItem;
                r.ShowDialog();
            }
        }
0

ok, to też mi się już udało, teraz męczę się z przesyłaniem danych z form1 do form2, który jest w innym wątku. Jaki jest na to sposób?

chciałbym aby r.label1.text (z form2) = "Rozmowa z" + listBox1.SelectedItem.ToString(); (z form1)


        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (listBox1.SelectedItem != null)
            {

                //rozmowa r = new rozmowa();

                //r.ShowDialog();

                var t = new Thread(() =>
                {
                    var r = new rozmowa();
                    r.label1.Text = "Rozmowa z LALALALA " ;


                    r.ShowDialog();

                });


                t.SetApartmentState(ApartmentState.STA);
                t.Start();



            }
        }

0

Utwórz sobie współdzielony obiekt. Napisz sobie klasę która będzie zawierała właściwość typu string, bo w labelach używasz stringów, zaimplementuj w niej interfejs INotifyPropertyChanged. No i potem tworzysz w głównym formie ten obiekt i przekazujesz go w konstruktorze drugiego forma (konstruktor sam musisz napisać, przyjmujący odpowiedni argument). W każdym formie musisz mieć pole w którym będziesz przechowywał referencję do tego obiektu. No i potem musisz jeszcze odpowiednio zbindować kontrolki z tą właściwością w obu formach, dzięki czemu jeżeli w tym obiekcie wartość tej właściwości zostanie zmieniona(poprzez któryś z formów) to wtedy z automatu zmieni Ci się wartość w kontrolce w drugim formie. Taki prymitywny sposób, ale powinien Ci wystarczyć.

0

hmm stwierdziłem, że na dzisiaj już dość i właśnie w akcie sprawdzania czegokolwiek, dodałem zmienną string w ifie = selecteditem, a potem "rozmowa z" + string, i działa :P

 private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (listBox1.SelectedItem != null)
            {
                string odbiorca = listBox1.SelectedItem.ToString();
                //rozmowa r = new rozmowa();

                //r.ShowDialog();

                var t = new Thread(() =>
                {
                    var r = new rozmowa();
                    r.label1.Text = "Rozmowa z "+ odbiorca;


                    r.ShowDialog();

                });


                t.SetApartmentState(ApartmentState.STA);
                t.Start();



            }
        }

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