Wątki - problem z klasą nie będącą formą

dział ogólny

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez polymorphism » piątek, 19 marca 2010, 13:28

Skoro tworzysz watek w konstruktorze klasy to powinieneś go kończyć w destruktorze, za pomocą funkcji TerminateThread.

Nic z tych rzeczy! Funkcją TerminateThread zamykasz wątki, których nie możesz zamknąć w normalny sposób, ponieważ utraciłeś nad nimi kontrolę.

Normalny sposób to (tryb joinable):
  • danie sygnału do zakończenia, który spowoduje wyjście z funkcji wątka (żadne tam ExitThread).
  • czekamy na zakończenie -> WaitForSingleObject.
  • usuwany klamoty -> CloseHandle
.
Ostatnio edytowano piątek, 19 marca 2010, 13:48 przez polymorphism, łącznie edytowano 1 raz
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: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » piątek, 19 marca 2010, 13:47

Nie EndThread tylko ExitThread. Z opisu wynika, że ta funkcja służy do kończenia wątku, należy jej użyć w połączeniu z funkcją GetExitThreadCode. Co do TerminateThread to się zgadzam.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez polymorphism » piątek, 19 marca 2010, 13:58

Nie EndThread tylko ExitThread

I tak, i nie. EndThread jest funkcją VCL, która robi dokładnie to samo co ExitThread, ale dla jasności przekazu poprawiłem.

Z opisu wynika (...) należy jej użyć w połączeniu z funkcją GetExitThreadCode

Z jakiego opisu?

Co do użycia ExitThread z PSDK:

    ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.
... i tyle w temacie, tłumaczyć chyba nie muszę.

swoją drogą, ten temat był już wałkowany na tym forum. Powinieneś poprawić arta, bo ludzi niepotrzebnie w błąd wprowadza.
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: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » piątek, 19 marca 2010, 14:25

Poradę pisałem jeszcze za czasów Borland C++Builder 4 i wtedy stosowanie ExitThread było częstą praktyką i nie tylko ja to stosowałem. Porada jest już mocno przestarzała.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez Corvis » piątek, 19 marca 2010, 15:39

To jeszcze jedno pytanie. Czy wątek powinien być uruchamiany za każdym razem przy wowołaniu funkcji Maluj(), czy może tak jak ja zrobiłem - chodzi cały czas i czeka na flagę która ustawiona wywoła Malowanie ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez polymorphism » piątek, 19 marca 2010, 15:40

Niech czeka, ale użyj do tego systemowych eventów.
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: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » piątek, 19 marca 2010, 16:07

A ja bym tworzył wątek w funkcji Maluj, a po zakończeniu malowania bym go usuwał.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez banita » sobota, 20 marca 2010, 19:37

sory ze troche odskocze od tematu...
czemu tyle ludzi kozysta w funkcji(watki) systemowych jezyka C kiedy do dyspozycji sa bardzo dobre obiektowe biblioteki ktore te funkcje ladnie opakowuja?
dla mnie naturlanym spsosobem jest podejscie: uzywam VCL to pisze z wykozystaniem TThread, uzywam Qt to pisze w QThread, moza tez skozystac z bibolioteki Boost Thread ktorej obsluga jest duzo lepsza niz wywolywanie funnkcji jezyka C.
Jesli juz C to duzo leszpym rozwiazaniem(moim zdaniem) jest uzycie biblioteki PThread(jest port na windowsa).
Nie mowica juz o mechanizmach zawartych w NET.

co do wykozystania TCanvas w watkach to klasa ta posiada odpowiednie metody synchronizujace prace watkow.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows 7Opera

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez polymorphism » sobota, 20 marca 2010, 20:17

czemu tyle ludzi kozysta w funkcji(watki) systemowych jezyka C kiedy do dyspozycji sa bardzo dobre obiektowe biblioteki ktore te funkcje ladnie opakowuja?

Z tego samego powodu, dla którego piszą w C++ tak, jakby pisali w C. Podejrzewam, że wynika to z tego, że często we wszelakich forach, tutorialach tudzież książkach podawane są rozwiązania typowe dla C. Początkujący nie będzie wnikał w zasadność użycia tej a nie innej metody, on po prostu uzna, że tak ma być (bo działa) i koniec. Później napisze tutoriala lub podpowie komuś w ten sam sposób, jak jemu podpowiedziano, i koło się kręci ;) Z drugiej jednak strony taka CreateThread jest w pewnym sensie bardziej przenośna niż klasa TThread, wxThread lub inna. Próba wprowadzenia w problematykę wielowątkowości mogłaby być horrorem przy tej mnogości klas.

Jesli juz C to duzo leszpym rozwiazaniem(moim zdaniem) jest uzycie biblioteki PThread(jest port na windowsa).

Pod windowsem jedynym "za" jest przenośność, nic więcej.
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: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » niedziela, 21 marca 2010, 08:22

Jak widzę wszyscy piszą o klasie TThread, ale nikt nie podaje przykładu.

Wydaje mi się, że w miarę zrozumiały przykład wykorzystania klasy TThreat z synchronizacją znajdziesz w tym poście: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=424&p=2619&hilit=tthread#p2617 oraz tutaj: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=124&p=738&hilit=tthread#p738
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » niedziela, 21 marca 2010, 12:35

Nie będę się zastanawiał nad sensownością i przeznaczeniem tej aplikacji, gdyż z kodu można wnioskować, ze to tylko jakiś projekt testowy. Pokażę przykład zastosowania klasy TThread bez synchronizacji do wywołania funkcji Obliczenia w oddzielnym wątku.

Plik nagłowkowy Unit2.h:
► 


Plik źródłowy Unit2.cpp:
► 


Wątek uruchamia się po wywołaniu funkcji Execute klasy test:

Kod: Zaznacz cały

void __fastcall TForm1
::Button2Click(TObject *Sender)
{
    t->ResumePause(); // wstrzymaj - uruchom ponownie
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    t->Execute(); // odpal wątek
}
 


To by było tyle, nie znam zbyt dobrze tej klasy, a to co tutaj skonstruowałem wynika z mojego rozumienia dokumentacji.
Zauważysz tutaj funkcje Invalidate, ale użycie klasy TThread rozwiązuje problem z "migotaniem okna" podczas rysowania.



I po to jest to forum, a nie po to by prowadzić jałowe dyskusje. Jeżeli ktoś ma coś więcej do powiedzenia w tej kwestii to proszę bardzo.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez Corvis » poniedziałek, 22 marca 2010, 08:30

Dzięki baronie - ciężko jest znaleść w internecie jakiś konkrenty przykład z wątkami - wszystko jest tak jakoś porozbijane :)

Cały ten kod który przesłałem, jest kodem testowym na podstawie którego napiszę inny. Dokładnie będzie to program do wykresów tworzonych na podstawie transmisji przez RSa. Dane będą przychodzić co 100 [ms]. Poco wątki, ktoś pytał ? A no poto, jeżeli będe miał bufor np. 25mb i będe chciał ścisnąć wykres bardzo mocno - tak aby wszystkie dane zobaczeć na 1 ekranie co spowoduje ogromną ilość pomiarów na 1 pixel i malowanie zabije transmisje szeregową - wszystko zwolni.

Mam jeszcze jedno pytanie odnośnie kopiowania narysowanej bmp na PaitBoxa - w którym to momęcie najlepiej to robić i w której klasie ?? Z początku myślałem, o TImerze który będzie sprawdzał status flagi odpowiedzialnej za kopiowanie ( bo kopiowac można np co 2 pomiary - 200[ms] ).


Dzięki za pomoc.

Dyskusja na temat wątków się zawsze przyda bo jest to dość ciężki temat :)

Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez Cyfrowy Baron » poniedziałek, 22 marca 2010, 10:09

Mam jeszcze jedno pytanie odnośnie kopiowania narysowanej bmp na PaitBoxa - w którym to momęcie najlepiej to robić i w której klasie ?? ...


Pytanie jest trochę dla mnie niezrozumiałe. Cokolwiek rysujesz w PainBox musisz to robić w zdarzeniu OnPaint w przeciwnym razie wszystko będzie wymazywane podczas odświeżania.



Z początku myślałem, o TImerze który będzie sprawdzał status flagi odpowiedzialnej za kopiowanie ( bo kopiowac można np co 2 pomiary - 200[ms] ).


Tego to już wogóle nie rozumiem. Pisząc o fladze masz oczywiście na myśli jakąś zmienną typu boolean. Co do interwału pomiarów to oczywiście można ustawić to w Timer'ze, ale pomiar czasu zegara będzie zakłócany przez procesy działające w systemie, więc nie będzie dokładny, chyba, że go zsynchronizujesz z zegarem bios'u, ale dla tak małego przedziału czasu cykliczne wyświetlanie wyników pomiarów może stanowić problem.



jeżeli będe miał bufor np. 25mb i będe chciał ścisnąć wykres bardzo mocno - tak aby wszystkie dane zobaczeć na 1 ekranie co spowoduje ogromną ilość pomiarów na 1 pixel i malowanie zabije transmisje szeregową - wszystko zwolni.


W takim wypadku może się zdarzyć, że proces zaangażuje w całości procesor i nie będzie można wykonać innych operacji, by temu zapobiec, być może trzeba by taki proces uruchomić z niskim priorytetem:

Kod: Zaznacz cały

    MyThread 
= new TMyThread(this);
    MyThread->Priority = tpLowest; // enum TThreadPriority
 


Kod: Zaznacz cały

enum TThreadPriority
{
    tpIdle, // bezczynność systemu - brak
    tpLowest, // 2 poziomy poniżej normalnego
    tpLower, // 1 poziom poniżej normalnego
    tpNormal, // normalny
    tpHigher, // 1 poziom powyżej normalnego
    tpHighest, // dwa poziomy powyżej normalnego
    tpTimeCritical // czasu rzeczywistego - lepiej nie stosować
};
 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wątki - problem z klasą nie będącą formą

Nowy postprzez polymorphism » poniedziałek, 22 marca 2010, 10:26

(...) jeżeli będe miał bufor np. 25mb i będe chciał ścisnąć wykres bardzo mocno - tak aby wszystkie dane zobaczeć na 1 ekranie co spowoduje ogromną ilość pomiarów na 1 pixel i malowanie zabije transmisje szeregową - wszystko zwolni.

Jaki charakter ma ten wykres? Coś takiego:
Obrazek
:?:



(...) ciężko jest znaleść w internecie jakiś konkrenty przykład z wątkami - wszystko jest tak jakoś porozbijane

To żart? :lol:
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: Wątki - problem z klasą nie będącą formą

Nowy postprzez Corvis » poniedziałek, 22 marca 2010, 10:30

1 - nie sciśnięte
2 - ściśnięte
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 58 gości

cron