CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Mały problem z wielowątkowością...

Mały problem z wielowątkowością...

dział ogólny

Re: Mały problem z wielowątkowością...

Nowy postprzez polymorphism » środa, 25 maja 2011, 10:57

Przecież tak właśnie działała moja pierwsza funkcja (...)

Slynx, przeczytaj jeszcze raz wątek śledząc uważnie kontekst moich wypowiedzi, bo odnoszę wrażenie, że go gubisz i tworzysz niepotrzebne dyskusje nad czymś, czego nie ma.

Więc jak to w końcu jest ?

W C++ wszystkie obiekty stworzone na stercie, czyli poprzez operator new, powinny zostać usunięte operatorem delete. Tu automatyzm, taki jak w przypadku obiektów stworzonych na stosie, nie zachodzi.

Jeśli chodzi o GC w C++/CLI, to z tego co wyczytałem, wywołanie delete nie powoduje natychmiastowego zwolnienia pamięci, tak jak to ma miejsce w standardowym C++, jedynie wywołuje destruktor klasy (pamięć oczywiście zostanie w swoim czasie zwolniona przez GC). Takie jawne niszczenie obiektu ma sens tylko wtedy, gdy za tym niszczeniem idą konkretne działania (np. zamknięcie połączenia czy strumienia plikowego), które muszą być wykonane w danej chwili. Generalnie odsyłam do jakiejś literatury, bo tu sprawa niszczenia obiektów jest nieco bardziej zawiła niż w C++.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mały problem z wielowątkowością...

Nowy postprzez Slynx » piątek, 27 maja 2011, 19:30

Jak mogę przekazać np, textBoxa, czy jak w tym wypadku flowLayoutPanel do wątku ? Tak jak jest w kodzie. Można w jakiś inny sposób przekazać coś takiego ?
KOD cpp:     UKRYJ  
        System::Void Appearance::Roll_Down_Up(FlowLayoutPanel ^ flow_layout_container, int min_size, int max_size)
        {
                System::Threading::Thread ^ thr = gcnew System::Threading::Thread(gcnew System::Threading::ParameterizedThreadStart(this, &Appearance::Roll_Down_Up_T));
                thr->Start(flow_layout_container);
        };
 

KOD cpp:     UKRYJ  
        System::Void Appearance::Roll_Down_Up_T(System::Object ^ obj1)
        {
                FlowLayoutPanel ^ flow_layout_container = // i co tutaj ? ;
        }
 
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Mały problem z wielowątkowością...

Nowy postprzez polymorphism » piątek, 27 maja 2011, 20:11

KOD cpp:     UKRYJ  
FlowLayoutPanel^ flow_layout_container = (FlowLayoutPanel^)obj1;
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mały problem z wielowątkowością...

Nowy postprzez Slynx » piątek, 27 maja 2011, 22:22

No dobra, może trochę źle pytanie zadałem. Załóżmy, że przez argument metody "Start" chcę przekazać 3 obiekty, różnego typu. Jako, że metoda przyjmuje tylko 1 argument to trzeba by 3 obiekty połączyć w jeden (tzn, tak robiłem na stringach, int-ach i innych typach prostych). A czy można coś takiego zrobić dla np. wymienionego w poprzednim poście flowlayoutpanel i 2xint ?

--
W sumie to nie ważne. Szkoda zachodu. Tutaj jest jeszcze problem z przekazaniem referencji do obiektu, bo przez to przekazywanie z funkcji do funkcji gdzieś się coś gubi. I używam funkcji Sleep, która nie chce współgrać z wątkami, zarówno ta z Windows.h jak i z .NET-owych. Wystawię wątek na zewnątrz funkcji i nie będzie problemu.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Mały problem z wielowątkowością...

Nowy postprzez Slynx » środa, 1 czerwca 2011, 12:13

Chyba wiem o co Ci chodziło przy tym KISS i wątkach. Trochę przemyślałem ten temat i zamiast dawać coś w stylu
KOD cpp:     UKRYJ  
                System::Boolean MailBox::DoLogin(System::String^ login, System::String^ password)
                {
                        thread = gcnew Thread(gcnew ParameterizedThreadStart(this, &MailBox::Login_T));
                        thread->Start(login + "&" + password);
                        thread->Join();
                        delete thread;
                        return result_login;
                };
                System::Void MailBox::Login_T(System::Object^ obj)
                {
                        System::String^ temp = Convert::ToString(obj);
                        array<System::String^> ^ xxx = temp->Split('&');
                        result_login = Login(xxx[0], xxx[1]);
                        thread->Abort();
                };
 

i tym samym wrzucać dla każdej metody inną zmienną do wykorzystywania dla danej metody, zrobiłem coś takiego, że wyrzuciłem to wszystko, te wszystkie metody zaczynające się od "Do" i ich odpowiedniki dla wątków (czyli kończące się na "_T") (czyli ponad 20 metod usuniętych) i zamiast tego stworzyłem jedną właściwość klasy (property) "Last_Response", zawierającą dane z ostatniej metody. Po prostu wewnątrz metody skrzynki, np. Login jest ostatnia linijka ustawiająca tą właściwości (czyli dla klasy interfejsu). W ten sposób zostały tylko metody wirtualne, które będą miały odpowiednie dane w zależności od użytego konstruktora i jedną właściwość (w sumie nie wiem czy tak to się tłumaczy na nasz język), a prace na wątkach przeniosę warstwę wyżej.
Nie wiem czy to miałeś na myśli, ale na razie tyle sam wykombinowałem.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Mały problem z wielowątkowością...

Nowy postprzez polymorphism » środa, 1 czerwca 2011, 12:43

Każde rozwiązanie, które powoduje, że kod jest przejrzysty, spójny i logiczny, a przez to mniej skomplikowany, co skutkuje mniejszą ilością popełnionych błędów, jest dobre.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mały problem z wielowątkowością...

Nowy postprzez Slynx » wtorek, 7 czerwca 2011, 21:24

No dobra, może trochę źle pytanie zadałem. Załóżmy, że przez argument metody "Start" chcę przekazać 3 obiekty, różnego typu. Jako, że metoda przyjmuje tylko 1 argument to trzeba by 3 obiekty połączyć w jeden (tzn, tak robiłem na stringach, int-ach i innych typach prostych). A czy można coś takiego zrobić dla np. wymienionego w poprzednim poście flowlayoutpanel i 2xint ?

--
W sumie to nie ważne. Szkoda zachodu. Tutaj jest jeszcze problem z przekazaniem referencji do obiektu, bo przez to przekazywanie z funkcji do funkcji gdzieś się coś gubi. I używam funkcji Sleep, która nie chce współgrać z wątkami, zarówno ta z Windows.h jak i z .NET-owych. Wystawię wątek na zewnątrz funkcji i nie będzie problemu.


ale z drugiej strony ;)

Można przekazać np. 3 obiekty różnego typu, np. int, String^ i textBox ? Metoda Start umożliwa przekazanie tylko jednego parametru.

Pytam bardziej z ciekawości, bo to już mam zrobione w inny sposób.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Mały problem z wielowątkowością...

Nowy postprzez polymorphism » wtorek, 7 czerwca 2011, 22:03

Można. Stwórz klasę, która będzie zawierać te trzy zmienne, i przekaż jej instancję w parametrze nowo tworzonego wątka.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Mały problem z wielowątkowością...

Nowy postprzez Slynx » wtorek, 7 czerwca 2011, 22:45

No racja, obiektem może być wszystko, więc czemu nie cała klasa...
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 4 gości