Qt - QThread

0

Zakładam temat, bo została poruszona ciekawa kwestia wątków w tym temacie:

enedil napisał(a):

(...) tylko potrzeba zrozumieć co to są wątki, czym jest pula wątków (...)

Więc na początek chciałbym aby ktoś mi wyjaśnił:

  1. Czym są wątki
  2. Czym jest pula wątków
  3. Jak działa QThread (dobrze jest rozumieć, to, czego się używa)
  4. Jak używać QThread
2

No to jeśli już stawiamy sobie wymagania, to ja chciałbym, żebyś zapoznał się chociażby pobieżnie z książką

Ben-Ari M., Principles of concurrent and distributed programming: algorithms and models (PDF do znalezienia w sieci)

Dzięki temu unikniemy niepotrzebnej szamotaniny w wątku, która jest nieunikniona przy dostatecznym braku podstaw teoretycznych. Oczywiście, jeśli będziesz mieć konkretne pytania, z chęcią odpowiedź na nie się znajdzie.

2

Ogólnie: jeśli pytasz o tak podstawowe rzeczy, to na 99% tych wątków do niczego nie potrzebujesz. A nawet jeśli myślisz, że potrzebujesz to zrób dwa kroki w tył, przemyśl i wykombinuj dlaczego jednak nie potrzebujesz. A jeśli nawet stwierdzisz że jednak, to w ramach ćwiczenia spróbuj rozwiązać problem w oparciu o pętlę zdarzeń czy inne nieblokujące techniki. Opłaci się. Sygnały, timery, select i poll Twoimi przyjaciółmi. Pobaw się, kombinuj, poczytaj.

Jeśli nadal się upierasz, że tego potrzebujesz:
Little book of semaphores na początek może być niezła (aczkolwiek miewa subtelne błędy). Jest tam przedstawiona masa problemów synchronizacyjnych. Życia może nie starczyć ;)

Do poczytania, niekoniecznie w kontekście Qt, ale C++ ogólnie i co może pójść nie tak:
https://www.amazon.com/C-Concurrency-Action-Practical-Multithreading/dp/1933988770 (przy czym tu też znalazłem błąd/nieścisłość przynajmniej w jednym miejscu. Może z czasem będzie więcej, wracam do tej książki co jakiś czas)

W kontekście Qt: pierwsze i najważniejsze: naucz się korzystać ze slotów i sygnałów. Zrozum pętlę zdarzeń. Bez tego do wątków nie podchodź.
Jak już podejdziesz:
NIGDY NIE DZIEDZICZ Z QTHREAD choćby Ci gorące żelazo w tyłek cisnęli. Wynika to z faktu w jaki sposób działa pętla zdarzeń.
https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong
Zapoznaj się też z QStateMachine: https://doc.qt.io/qt-5/qstatemachine.html

0

już chyba po dwóch zdaniach coś mnie tknęło w sprawie wątków. Chciałbym tylko aby ktoś mnie poprawił jeżeli się mylę. Wytłumaczę to w prosty sposób, taki laicki.

Wyobraźmy sobie pętlę główną w systemie operacyjnym, to jest pętla która nigdy się nie kończy... Zadaniem tej pętli w systemie operacyjnym jest "zbieranie" żądania przydzielenia zasobów do CPU (czy to od usera czy to od sprzętu) aby jakiś program lub wiele programów mogły się wykonać, a my jako użytkownicy mamy wrażenie, że te programy działają jednocześnie i w tym samym czasie.

teraz stop klatka milisekunda po milisekundzie ;)
Załóżmy, że pracuje 10 programów, ta pętla ma w sobie do obsłużenia te 10 programów i dla uproszczenia przyjmiemy, że pętla zaczyna obsługę od programu numer 1, program numer 1 coś wykonał ale nie zakończył swojego działania, następnie po obsłużeniu tego programu pętla główna przechodzi do obsługi programu numer 2, program numer 1 wisi i czeka w kolejce na obsłużenie, następnie gdy program numer 2 coś wykona, to pętla zawiesza program numer 2 i przechodzi do obsługi programu numer 3, program numer 1 i 2 czekają grzecznie w kolejce na obsługę i cały ten cykl trwa aż pętla zdarzeń obsłuży pozostałe 9 programów, cykl obsługi kolejki trwa również do momentu aż któryś z programów nie zakończy swojego działania.

Procesor przetwarza te informacje tak szybko, że nie jesteśmy w stanie wyłapać momentu obsługi jakiegoś programu przez procesor i mamy wrażenie, że działa to płynnie.

I tutaj dochodzimy do sedna sprawy programowania wątków. Dlaczego odradzacie programowania wątkowego. Bo za obsługę wątków i ich przydzielanie wyręcza mnie system operacyjny więc po co się w to bawić ? Jeżeli mam taką potrzebę programowania wątku, to w tym momencie wchodzę w interakcję z systemem operacyjnym i to wygląda tak, jakbym na siłę systemowi operacyjnemu wstrzykiwał wątek który ma obsłużyć priorytetowo i nie jestem w stanie przewidzieć zachowania się programu i systemu operacyjnego.

Tak z grubsza to rozumiem, no chyba, że ktoś rozpisze znacznie lepszą analogię od mojej

1

Pętlę zdarzeń +- rozumiesz dobrze.
Co do wątków: nic priorytetowo ani nic z tych rzeczy. Problemów jest kilka:
a. synchronizacja jawna, tzn. mutexy, semafory, CV. Niby "prosta sprawa", bo masę książek o tym napisano, ale już tutaj łatwo się jorgnąć. Jednakże
b. dochodzą wszelkie typu niuanse specyficzne dla C++, typu konstruktory kopiujące, exception safety, referencje, lifetime. Już w tym momencie przestaje być łatwo.
c. dochodzi synchronizacja - powiedzmy - niejawna: IO, strumienie, mutexy globalne (np. przy alokacji pamięci), niejawne efekty uboczne, cała problematyka re-entrancy w bibliotece standardowej (to bardziej C, ale te biblioteki się często współdzieli).
O tym nie mieli chyba pojęcia nawet inżynierowie w ST Microelectronics piszący tam stack USB
d. zysk wydajnościowy bywa mierny w stosunku do pracy włożonej.
e. utrzymanie tego to piekło nie ziemi.

EDIT: a w przypadku Qt dochodzi tematyka specyficzna dla tego frameworka, tzn. przesyłanie sygnałów/slotów pomiędzy wątkami, osadzenie wątku i jego bloku kontrolnego w kontekście pętli zdarzeń...i masa błędnych przykładów w necie i życiu, bo "komuś kiedyś"

0

@alagner:

a w przypadku Qt dochodzi tematyka specyficzna dla tego frameworka, tzn. przesyłanie sygnałów/slotów pomiędzy wątkami, osadzenie wątku i jego bloku kontrolnego w kontekście pętli zdarzeń

możesz to rozwinąć ? bo nie bardzo wiem co mogą mieć sygnały i sloty do wątków ? Chodzi o ich wykonanie podczas pracy wątku ?

0

Wrzucałem parę postów temu artykuł nt. QThread o wymownym tytule "You're doing it wrong".

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