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

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

dział ogólny

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

Nowy postprzez Slynx » sobota, 14 maja 2011, 20:33

Doszedłem do momentu w którym zalety wielowątkowości są także problemami ; p
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);
                        //tu wstrzymujemy do czasu wykonania
                        delete thread;
                        return result_login;
                };
                System::Void MailBox::Login_T(System::Object^ obj)
                {
                 // coś co ustawia result_login na odpowiednią wartość.
                };
 

Problem wynikł z tego, że odpalenie wątku (thread->Start) powoduje wykonanie funkcji Login_T, która - jak wiadomo - wykona się na osobnym wątku, nie przeszkadzając programowi. Jednak żeby wyrzucić dane ("return result_login") kod musi poczekać na wykonanie się wątku. Problem jest z samym wstrzymaniem. nie mogę tego wstrzymać w żadne sposób w stylu while(1), bo straci to sens. Chciałem użyć eventów (konkretnie delegate) by po zakończeniu wątku automatycznie wywoływał to zdarzenie, a do tego zdarzenia podpiąć dalszą część funkcji (czyli trzeba by ponownie rozdzielić funkcję). To bardziej konsultacja niż problem. Jest jakiś inny, lepszy, prostszy sposób, czy to o czym mówię, jest dobrym rozwiązaniem ?

P.S. swoją drogą to trochę dziwne, bo jak zauważycie dałem zaraz po Start - delete thread. Wydawało mi się, że przerwie wykonywani, czy wyrzuci błąd, a mimo to kontynuował i wywołał wszystkie funkcje.
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 » niedziela, 15 maja 2011, 09:33

Jest jakiś inny, lepszy, prostszy sposób

Jest. Metoda Join czeka na zakończenie wątku.

P.S. swoją drogą to trochę dziwne, bo jak zauważycie dałem zaraz po Start - delete thread. Wydawało mi się, że przerwie wykonywani, czy wyrzuci błąd, a mimo to kontynuował i wywołał wszystkie funkcje.

delete wywołuje destruktor klasy Thread, a ten zapewne wywołuje metodę Join - co jest całkiem typowe dla klas tworzących wątki.
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, 20 maja 2011, 21:23

Ok, dodałem to i nawet nie popatrzyłem jak to działa. Wstawienie Join zaraz po uruchomieniu wątku rzeczywiście blokuje ten wątek do czasu jego zakończenia... ale blokuje też wątek główny, więc równie dobrze mógłby wstawić while(1) i działało by tak samo.

Problemem jest to, że Join łączy ze sobą dwa wątki, ale nic w tym czasie nie będzie wykonywane. Żeby to zadziałało jak należy musiałbym chyba odpalić w nowym wątku samo wywołanie metody tej klasy MailBox, wtedy funkcja Login mogłaby się z nią połączyć (Join) a wątek główny został by nienaruszony. Trochę takie "wspinaczkowe" podejście...
Może trochę niejasno mówię.

To jest odpalane w głównym programie, czyli głównym wątku
KOD cpp:     UKRYJ  
                MailBox^ box = gcnew Mailboxes::host1();
                MessageBox::Show(box->DoLogin("asdasdqs", "asdedf").ToString());
 

a to są właśnie funkcje z klasy MailBox
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)
                {
                 // coś co ustawia result_login na odpowiednią wartość.
                };
 

Tak więc, znowu zapytam, o to samo, rozwiązanie. Czy każdorazowe tworzenie obiektu klasy MailBox będzie wymuszało tworzenie wątku w głównej pętli ?
(Zadaje pytania, na które chyba znam odpowiedzi :/) Jeśli uruchomię samo box->DoLogin na osobnym wątku i będę chciał pojechać dalej z programem (by się nie zaciął) to stracę kontrolę nad tym wątkiem, bo już go potem nie złapię (mówimy o dynamicznym tworzeniu wątków w trakcie działania programu, a nie o pewnej tablicy z deklaracjami wątków (jakby wolnymi miejscami)). Więc nawet tak na prawdę nie wiem jakie jest pytanie :D
Nie wiem za bardzo jak podejść do samego problemu w teorii. Jak obsługuje się metody na wątkach tworzonych dynamicznie, jak je kontrolować i najważniejsze, jak pozwolić pracować dalej głównemu wątkowi.

(Tak wiem, teraz pytanie na pewno nieprecyzyjne, ale nawet nie wiem jak określić problem:/)
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 » sobota, 21 maja 2011, 10:48

(...) ale blokuje też wątek główny, więc równie dobrze mógłby wstawić while(1) i działało by tak samo.

Nie działałoby tak samo. Pętla prawdopodobnie zeżarłaby 100% mocy CPU, metoda Join - 0%. Metoda czeka na zakończenie wątku, pętla na nic nie czeka. Trochę nie rozumiem Twojego rozczarowania, przecież dostałeś to, czego chciałeś (świadomie lub nie ;)).

Ale do rzeczy. Generalnie użycie wątka w DoLogin jest pozbawione sensu, bo nic Ci on nie daje. Mógłbyś zrobić na przykład tak:
KOD cpp:     UKRYJ  
System::Void MailBox::DoLogin(System::String^ login, System::String^ password)
{
        thread = gcnew Thread(gcnew ParameterizedThreadStart(this, &MailBox::Login_T));
        thread->Start(login + "&" + password);
}

Wtedy logowanie odbywa się asynchronicznie. Problem w tym, że za każdym razem, gdy będziesz chciał użyć klasy, będziesz musiał testować, czy już możesz z niej korzystać, czy już jest zalogowana. Nieciekawa perspektywa. Dlatego myślę, że całą sprawę trzeba uprościć, przyjąć proste założenie, że jeśli obiekt klasy istnieje, to znaczy, że jest już zalogowany (to implikuje przeniesienie logowania do konstruktora). Zatem wystarczy oddelegować tworzenie obiektów tej klasy do innego wątka, i dopiero, gdy proces logowania zostanie poprawnie przeprowadzony, obiekty zostają zwrócone aplikacji gotowe do użycia. Trzymaj się zasady KISS, nie komplikuj klas, niech robią tylko to, do czego zostały stworzone.
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 » sobota, 21 maja 2011, 11:39

Trzymaj się zasady KISS

Czy ktoś wspominał, że programistą to ja jestem tak "z lotu" ? xD

Problemem jest wywołanie takiej metody, puszczenie dalej programu, by mógł pracować, a następnie zorientowanie się kiedy ten wątek wykonał swoje zadanie i umieścił odpowiednie dane w odpowiedniej zmiennej. Chciałem wykorzystać zdarzenia, które byłyby wykonane dla zakończenia wątku...

Ale masz rację, jeśli tak to wygląda to umieszczanie poszczególnych metod w wątkach chyba nie ma sensu i tak wywołana może być tylko jedna na raz, dlatego właśnie myślałem, że najlepiej byłoby uruchomić cały obiekt tej klasy na oddzielnym wątku
Trochę nie rozumiem Twojego rozczarowania, przecież dostałeś to, czego chciałeś (świadomie lub nie )

No tak, racja, ale chyba w sumie nie wiem jak tego użyć, tzn. spodziewałem się innego efektu, a teraz wiem, że inny nie jest możliwy :/

Cały czas się właśnie nad tym zastanawiam, bo żeby to odpowiednio pracowało wątki musiały by być tworzone wewnątrz głównego programu, głównego okna. Może rzeczywiście coś na kształt dynamicznej tablicy z deklaracjami wątków, wtedy mógłbym to kontrolować...

Ty z kolei mówisz o umieszczeniu metody login w konstruktorze... no tak, a w takim razie co z innymi metodami ? Tworzenie nowego obiektu dla wywołania każdej metody ? No przecież nie. Konstruktor przeciążony ? No też nie. A zwracane wartości ? konstruktor przecież nie ma określonego typu zwracającego. I nawet jeśli to i tak sam konstruktor trzeba uruchomić na oddzielnym wątku, bo przecież tak samo jak każda inna metoda wstrzyma działanie programu. Trochę chyba nie rozumiem o co Ci chodzi...

Coś czuję, że te zabawy z wątkami i implikowanie tego całego głównego systemu zaczyna mnie przerastać : / Aż tak dobry nie jestem...

Wtedy logowanie odbywa się asynchronicznie. Problem w tym, że za każdym razem, gdy będziesz chciał użyć klasy, będziesz musiał testować, czy już możesz z niej korzystać, czy już jest zalogowana

Można sprawdzić poprzez
KOD cpp:     UKRYJ  
thread->CurrentState != Start

oraz sprawdzać zawartość zmiennej, jeśli jest "pełna" to znaczy, że już odbyło się logowanie.
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 » sobota, 21 maja 2011, 12:09

Ty z kolei mówisz o umieszczeniu metody login w konstruktorze... no tak, a w takim razie co z innymi metodami ? Tworzenie nowego obiektu dla wywołania każdej metody ?

A czy każda metoda wymaga wywołania w nowym wątku? No chyba nie...

A zwracane wartości ? konstruktor przecież nie ma określonego typu zwracającego.

Konstruktor może rzucić wyjątkiem, a jeśli nie lubisz wyjątków, zrób np. metodę Ok.

KOD cpp:     UKRYJ  
MailBox^ box = gcnew Mailboxes::host1("asdasdqs", "asdedf");
if(!box->Ok())
{
        MessageBox::Show("damn you!");
        delete box;
}
 


I nawet jeśli to i tak sam konstruktor trzeba uruchomić na oddzielnym wątku (...)

No tak, pisałem przecież. Takie podejście uprości konstrukcję klas pochodnych od MailBox, ponieważ wielowątkowość zostanie przeniesiona warstwę wyżej.

Coś czuję, że te zabawy z wątkami i implikowanie tego całego głównego systemu zaczyna mnie przerastać : /

Heh, wbrew pozorom wielowątkowość to dość skomplikowane zagadnienie.
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 » niedziela, 22 maja 2011, 18:28

No tak, pisałem przecież. Takie podejście uprości konstrukcję klas pochodnych od MailBox, ponieważ wielowątkowość zostanie przeniesiona warstwę wyżej.


Mówimy o tym

KOD cpp:     UKRYJ  
MailBox::Mailbox(String^ login, String^ password)
{
// nowy wątek i metoda logowania
};


i wtedy konstruktor przeciążony ? Dla każdej metody ?

A coś takiego

KOD cpp:     UKRYJ  
MailBox^ box = gcnew Mailboxes::host1("asdasdqs", "asdedf");

if(!box->Ok())
{
        MessageBox::Show("damn you!");

        delete box;
}
Przecież nie zadziała. Po wywołaniu konstruktora, od razu przeskoczy na kolejne polecenie, czyli sprawdzi box. Wyjdzie mu, że nie jest ok, bo host1 jest odpalony na osobnym wątku i if (if(!box->Ok())) wykona się przed wykonaniem metody na oddzielnym wątku. A jeśli damy Join... to chyba będzie to co wcześniej, czyli pogram się wstrzyma. Wynik dla box->Ok będzie pozytywne, ale program znowu będzie czekał na wykonanie metody w konstruktorze. Jeśli użyjemy wyjątków, to będzie to równoznaczne z użyciem zdarzeń, czyli to, o czym mówiłem na samym początku, w pierwszym poście.
wbrew pozorom wielowątkowość to dość skomplikowane zagadnienie.


Może nie sama wielowątkowość, ale dodawanie jej w głównym modułach programu, tak by każdy wątek znał swoje miejsce i kolejność.

Dobra, ja spróbuję nad tym trochę popracować. Na razie nie miałem czasu na analizę, to mówię tylko tak "z lotu".
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 » poniedziałek, 23 maja 2011, 10:24

i wtedy konstruktor przeciążony ? Dla każdej metody ?

Nie rozumiem, dla jakich metod?!

Przecież nie zadziała. Po wywołaniu konstruktora, od razu przeskoczy na kolejne polecenie, czyli sprawdzi box.

:D To był tylko przykład użycia, coby przekaz był jasny (jak widać nie był). No i to oczywiście zadziała, jeśli logowanie nie będzie asynchroniczne.

Może nie sama wielowątkowość, ale dodawanie jej w głównym modułach programu, tak by każdy wątek znał swoje miejsce i kolejność.

Przecież to jest wielowątkowość. Stworzyć 100 wątków to żaden problem, ale zsynchronizować je to już coś. Problem wielowątkowości to przede wszystkim problem synchronizacji. Ten wątek od początku jest potwierdzeniem tego.
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 » poniedziałek, 23 maja 2011, 12:30

To chwila chwila.... mam uruchomić na oddzielnym wątku w kodzie głównego programu czy w kodzie tej klasy ? Rozumiem, że w kodzie głównego programu...

Nie rozumiem, dla jakich metod?!

Już się pogubiłem w Twoim rozumowaniu. To mam odpalić w wątku konstruktor klasy i wtedy ... ? Nie rozumiem o czym mówisz...
Mówisz o konstruktorze wewnątrz klasy czy o konstruktorze wywoływanym z głównego programu podczas tworzenia nowego obiektu tej klasy ? Bo jak na razie nie udało mi się ustalić, choć wydaje mi się, że pierwsza opcja jest bez sensu, bo niby co miałbym wywołać w tym wątku, a z kolei druga wymagała by wywoływania wszystkich kolejnych metod na tym samym wątku, więc to chyba też bez sensu O.o
No i to oczywiście zadziała, jeśli logowanie nie będzie asynchroniczne

No to na co mi zabawa z wątkami jak wszystko i tak mam odpalać nie asynchronicznie ?! Przecież od początku mówimy o wywoływaniu metod metodą asynchroniczną, by nie blokować programu. Przypominam, że podczas działania programu mogą wykonywać się np. 3 takie logowania na raz, więc muszą być oddzielne wątki, dlatego chciałem metody odpalać na wątkach....
Cholera, ale się na mieszało ; p
Ale podsumowując.... może jedno statyczne zdarzenie (dla wszystkich wywoływanych klas) do którego byłby wysyłany, coś na kształt identyfikatora danego obiektu (lub po prostu jego nazwa), wtedy w jednej metodzie można by obsłużyć wszystkie zdarzenia z wątków, choć nie wiem czy to wykonalne...

(Aktualnie muszę zająć się czymś innym, mam grafika na głowie i wyszła konieczna zmiana w interfejsie - rozwijane menu - którego nie ma w standardowych komponentach .NET, więc muszę go napisać, tak więc na razie wątki omawiamy "na sucho", ale postaram się szybko z tym uporać i wrócić do sedna)
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 » poniedziałek, 23 maja 2011, 13:08

To mam odpalić w wątku konstruktor klasy i wtedy ... ? Nie rozumiem o czym mówisz...

Bo żeby rozumieć, trzeba uważnie czytać. W wątku tworzysz klasę, ponieważ jej tworzenie może czasochłonne(zasada: klasa istnieje, znaczy, że zalogowana).

Mówisz o konstruktorze wewnątrz klasy czy o konstruktorze wywoływanym z głównego programu podczas tworzenia nowego obiektu tej klasy ?

Konstruktor ma to do siebie, że jest wewnątrz klasy i wywoływany jest z zewnątrz ;) Pytanie co najmniej dziwne...

No to na co mi zabawa z wątkami jak wszystko i tak mam odpalać nie asynchronicznie ?!

Pisałem, zasada KISS.

Przecież od początku mówimy o wywoływaniu metod metodą asynchroniczną, by nie blokować programu.

Hmm, a ja myślałem, że mówimy o logowaniu, które może zabrać trochę czasu, a nie wywoływaniu metod.
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 » poniedziałek, 23 maja 2011, 13:36

KISS - Keep It Simple, Stupid, czyli nie komplikuj, głupku
[...]Zawarcia w nazwie reguły określenia o lekceważącym charakterze (lub celowo obraźliwego - zależnie od punktu widzenia), pełne rozwinięcie skrótu jest czasem pomijane lub zastępowane innymi[...]

O tak...;) To mi wiele pomogło, od razu poczułem się inaczej ; )
W wątku tworzysz klasę, ponieważ jej tworzenie może czasochłonne(zasada: klasa istnieje, znaczy, że zalogowana).

Klasa ? czy metoda ? Bo w klasie są różne metody, metoda create nie wymaga wcześniejszego wywołania metody login, więc nie można z góry założyć, że przez konstruktor wywołasz logowanie.
Konstruktor ma to do siebie, że jest wewnątrz klasy i wywoływany jest z zewnątrz Pytanie co najmniej dziwne...

Bo z tego co wcześniej zrozumiałem, chciałeś przez konstruktor podać argumenty (login, password), wywołać konstruktor, a w konstruktorze stworzyć wątek i uruchomić na nim metodę logowania, więc wydawało mi się to bez sensu.
No to na co mi zabawa z wątkami jak wszystko i tak mam odpalać nie asynchronicznie ?!

Pisałem, zasada KISS.

Chyba mniej więcej rozumiem... chodzi Ci o to, że odpalić cały obiekt klasy na wątku (metoda asynchroniczna), a następnie wywoływać kolejne metody już na tym wątku (metoda synchroniczna). Jeśli tak to miałoby to sens, bo z jednego obiektu i tak nie wywołam dwóch metod create, bo nie takie jest założenie. Dla każdego obiektu metody powinny być wywoływane synchronicznie, ale sam obiekt klasy powinien być wywołany asynchronicznie (tzn, tyle zrozumiałem z tego co mi napisałeś).
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 » poniedziałek, 23 maja 2011, 15:01

O tak...;) To mi wiele pomogło, od razu poczułem się inaczej ; )

Skupiasz się na bzdetach a nie na istocie tej zasady.

    (...) [KISS] jest często wspominana przy dyskusji architektury lub szczegółów budowy projektów. Jej istotą jest dążenie do utrzymania eleganckiej i przejrzystej struktury, bez dodawania niepotrzebnych elementów.

Klasa ? czy metoda ?

Haha, ależ Ty komplikujesz rzeczy proste. Jeśli piszę o klasie, to znaczy, że mam na myśli klasę, a nie metodę czy cokolwiek innego. Ta wypowiedź odnosiła się do tego, co wcześniej napisałem o przeniesieniu logowania do konstruktora klasy. Wtedy tworzenie klasy będzie równoznaczne z logowaniem się na serwer pocztowy.

Bo z tego co wcześniej zrozumiałem, chciałeś przez konstruktor podać argumenty (login, password), wywołać konstruktor, a w konstruktorze stworzyć wątek i uruchomić na nim metodę logowania, więc wydawało mi się to bez sensu.

No jak mogłem tego chcieć, jeśli to Ty od początku z tym wyskoczyłeś?

Chyba mniej więcej rozumiem... chodzi Ci o to, że odpalić cały obiekt klasy na wątku (metoda asynchroniczna), a następnie wywoływać kolejne metody już na tym wątku (metoda synchroniczna).

No, mniej więcej (jeśli dobrze zrozumiałem Twoją wypowiedź).
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 » poniedziałek, 23 maja 2011, 18:56

Haha, ależ Ty komplikujesz rzeczy proste. Jeśli piszę o klasie, to znaczy, że mam na myśli klasę, a nie metodę czy cokolwiek innego. Ta wypowiedź odnosiła się do tego, co wcześniej napisałem o przeniesieniu logowania do konstruktora klasy. Wtedy tworzenie klasy będzie równoznaczne z logowaniem się na serwer pocztowy.

Ale tworzenie klasę NIE jest równoznaczne z zalogowaniem, przecież wyraźnie napisałem. Ta klasa nie służy tylko do logowania, pierwszą wywoływaną metodą NIE MUSI być akurat proces logowania, więc w konstruktorze NIE MOŻE być logowania. Dlatego mnie to zdziwiło o co Ci chodzi, czy chcesz jakiś przeciążony konstruktor dla każdej metody (create, login, itp), że w konstruktorze chciałeś wywołać jedną z metod. I wtedy pytania o klasę / metodę było jak najbardziej trafne.
No jak mogłem tego chcieć, jeśli to Ty od początku z tym wyskoczyłeś?

Jak ja nigdy nawet czegoś takiego nie proponowałem. Nigdy nie mówiłem o podawaniu argumentów przez konstruktor, bo nie miałoby to sensu.

Pierwotną koncepcją było wywoływanie każdej metody na tym samym wątku, czyli kolejkowanie. To już miałem. Problemem okazał się sam obiekt tej klasy i moment wywołania konkretnej metody, bo to nie obiekt pracował na osobnym wątku, a jedynie jej poszczególne metody, więc fakt, Twoje słówko KISS, miało by tutaj sens, bo w metody, które uruchamiałem na wątkach i tak działały w kolejce. Więc sorry, ale nie jestem tak oblatany jak Ty i nie wiedziałem, że tak to będzie działać. Teraz będę mógł usunąć ten cały kod z wątkami, bo już wiem, że nie będzie to działać.

Chciałem zrobić tak, by z poziomu głównego programu, nie trzeba było w ogóle zajmować się wątkami. A dla mnie jedynym rozwiązaniem, do którego sam doszedłem było zastosowanie zdarzeń i za ich pomocą informowanie o stanie wykonania wątku. Dokładnie TO była moja sugestia, a nie logowanie z poziomu konstruktora.

Jej istotą jest dążenie do utrzymania eleganckiej i przejrzystej struktury, bez dodawania niepotrzebnych elementów.

Tyle to ja wiedziałem, przed poznaniem tego słówka. Tylko, że nie rozumiesz, że coś co dla Ciebie może być banalne, dla innych może być skomplikowane, bo nigdy wcześniej nie stosowali takiej techniki / metody. A ja jedynie staram się to wszystko ogarnąć, tak by dla mnie to też stało się oczywiste.

Mam pewien sposób jak to zrobić, zobaczę czy da się to zapisać za pomocą kodu w stosunkowo prosty 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 » poniedziałek, 23 maja 2011, 20:34

Ale tworzenie klasę NIE jest równoznaczne z zalogowaniem, przecież wyraźnie napisałem.

Haha, ale ja nie pisałem o klasie w obecnej formie, tylko o klasie z przeniesionym logowaniem. No ale nieważne, nie drążmy tego tematu, bo widzę, że nie skumałeś, o co mi chodzi.

Ta klasa nie służy tylko do logowania

Tyle to się domyśliłem.

Jak ja nigdy nawet czegoś takiego nie proponowałem. Nigdy nie mówiłem o podawaniu argumentów przez konstruktor, bo nie miałoby to sensu.

Bardziej mi chodziło o tworzenie wątku wewnątrz metody, czyli że metoda działa asynchronicznie. A to, czy mowa o konstruktorze, czy metodzie, w tym kontekście nie ma większego znaczenia, problem będzie ten sam.

Problemem okazał się sam obiekt tej klasy i moment wywołania konkretnej metody, bo to nie obiekt pracował na osobnym wątku, a jedynie jej poszczególne metody

Obiekt to pewne miejsce w pamięci, ono - co oczywiste - nic nie robi, jedynie zawiera jakieś dane. To funkcje/metody są tą częścią programu, która coś robi.
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 » środa, 25 maja 2011, 01:20

Bardziej mi chodziło o tworzenie wątku wewnątrz metody, czyli że metoda działa asynchronicznie. A to, czy mowa o konstruktorze, czy metodzie, w tym kontekście nie ma większego znaczenia, problem będzie ten sam.

Jeśli dobrze rozumiem, to to już Ci pokazywałem w pierwszym poście, w kodzie, tj.
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);
                        //tu wstrzymujemy do czasu wykonania
                        delete thread;
                        return result_login;
                };
                System::Void MailBox::Login_T(System::Object^ obj)
                {
                 // coś co ustawia result_login na odpowiednią wartość.
                };
 
 

Przecież tak właśnie działała moja pierwsza funkcja, tworzenie nowego wątku, wykonywanie wszystkich operacji (Login_T) i czekanie na synchronizację z resztą (thread->Join()). No, ale problemem właśnie okazała się kontrola tego wszystkiego i o tym od początku mówię.
Problemem okazał się sam obiekt tej klasy i moment wywołania konkretnej metody, bo to nie obiekt pracował na osobnym wątku, a jedynie jej poszczególne metody

Obiekt to pewne miejsce w pamięci, ono - co oczywiste - nic nie robi, jedynie zawiera jakieś dane. To funkcje/metody są tą częścią programu, która coś robi.


Chodziło mi konkretnie o to, że możemy wywołać na osobnym wątku albo konstruktor danej klasy i kolejne metody, albo same metody, choć to i tak było bez sensu bo niczym się to nie różni (o ile konstruktor nie jest czymś "zapchany")

Miałem jeszcze jedno pytanie, nie dotyczące wątków, ale nie chcę zakładać tematu na jedno krótkie pytanie, bo mam taką... sprzeczność, tzn.
Zawsze gdy używa się instrukcji new (lub gcnew) obiekt należy potem zniszczyć (poprzez delete), ale jest też zasada, która mówi, że obiekty są automatycznie niszczone poza swoim blokiem (tzn. na zewnątrz { i }). A do tego wszystkiego dochodzi jeszcze "ułatwienie" języka (C++/CLI), dokładniej garbage collector, który dla "dobra" programisty zajmuje się usuwaniem niepotrzebnych obiektów. Więc jak to w końcu jest ? Co usuwać, a co jest usuwane automatycznie ?
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

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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