Wpis z mikrobloga

Cześć, robię pewną aplikację w c++ z użyciem #qt i mam pomysł jak ją rozbudować, natomiast nie wiem jak zrobić pewną część tej aplikacji i czy to w ogóle możliwe, mianowicie chodzi i takie coś:

Mam login screen (main window), loguję się i po poprawnym zalogowaniu wyskakuje okienko (na razie wszystko działa) jednak nie zamykam login screenu, bo mogę zalogować kolejne konto i chcę, by pojawiło się kolejne okienko (takie samo tylko z innymi parametrami), tylko problem w tym, żeby każde z tych okienek wykonywało swoje pętle tzn żeby nie było tak że najpierw pętle wykonuje login screen, później okno 1 a na końcu okno 2, tylko żeby wszystko odbywało się w tym samym czasie. Da się to jakoś zrobić w miarę łatwy sposób? Dodam, że próbowałem coś robić z tymi timerami w QT ale nie za bardzo to wychodziło.

Przepraszam, że wołam ale to w końcu trochę #programowanie a może ktoś robił coś podobnego.
  • 40
@SwordPL: Dzięki za odpowiedź. I jeszcze dodam, że nie chodzi o wątki, tylko podpięcie do procesu, na przykładzie logowania chyba lepiej to zobrazować :P
A wiesz może jeszcze czy to trudne do zaimplementowania?
@morsisko: Nie wiem, czy dobrze rozumiem o co ci chodzi. W każdym razie - Qt ma jedną pętlę obsługi zdarzeń, uruchamianą przez bodajże QApplication::run(), i ona obsługuje zdarzenia we wszystkich oknach. Nie ma czegoś takiego, że wydarzenia w jednym oknie blokują wydarzenia w innym (z wyjątkiem modali).
@frax: No tak ale załóżmy że mamy pętle w pierwszym oknie, i wydarzenie w drugim oknie zostanie wykonane dopiero po zakończeniu tego pierwszego (po zakończeniu pętli) więc teoretycznie się zablokuje na czas wykonywania pętli w 1 oknie, dobrze to rozumiem?
@morsisko: Nie. Pętla nie jest związana z żadnym oknem. Możesz odpalić QApplication::run() bez żadnego okna albo z 50 oknami, i będzie działać równie dobrze. Tyle tylko, że oczywiście kod tworzenia okien musi być albo przed run(), albo w jakimś wydarzeniu. Generalnie run() ma wrócić na samym końcu wykonania, więc po nim może być tylko jakiś kod sprzątający, a zwykle nie ma nic.
@frax: Wiem, ale zobacz załóżmy, że w jednym z okien dodam pętle while która będzie się wykonywała no nie wiem, 5 sekund, więc kolejne zadanie wykona się po skończeniu tej pętli. Wiem że to ::run() nie jest związanie z żadnym oknem, ale mi chodzi o poszczególne pętle (for/while/do while) w poszczególnych oknach. Chyba że to ::run() traktuje te okna jako "oddzielne" programy?

@SwordPL oj jeszzce do tego posta skierowanego do ciebie,
@SwordPL: Właśnie domyślałem się, że można do tego użyć wątków ale myślałem, że jest coś łatwiejszego. I w sumie nie lepiej użyć tych wątków z normalnego c++ niż tych z Qt? :P
@SwordPL: Hmm no ok, dzięki za odpowiedzi, spróbuje to jakoś ogarnąć, choć pewnie nie będzie łatwo, bo liczba tych okien może być przecież niestandardowa. Myślałem że jest jakiś łatwiejszy sposób. :P
@morsisko: Teoretycznie tak. Praktycznie - współbieżna praca większej ilości wątków, niż ilość dostępnych rdzeni sprowadzi się do wywłaszczania przez scheduler, ale jakąś tam iluzję jednoczesności powinno to dawać.
@morsisko: W takim razie chcesz mieć wątki. Wydaje mi się, że te z Qt są całkiem w porządku. Co do liczby wątków - istotne są tylko wątki, które naprawdę coś liczą, i ich nie powinno być dużo więcej, niż rdzeni. Wątków śpiących (np. czekających na jakiś plik albo socket) możesz mieś spokojnie kilkadziesiąt i więcej. O ile twoja aplikacja nie robi dużych ilości czasochłonnych obliczeń, raczej nie musisz się tym przejmować.
@morsisko: To nie powinien być problem. Ale nie potrzebujesz wątku do każdego okna, wystarczy jeden wątek główny i wątki poboczne odpalane na potrzeby czasochłonnych zadań (z puli, albo tworzone i usuwane w miarę potrzeby). Zresztą, i tak GUI możesz obsługiwać tylko z głównego wątku.