qt, wątki, obiektowo

0

Witam.

W programowaniu obiektowym jestem zielony. Muszę niestety napisać (na zaliczenie) dosyć, jak dla mnie, skomplikowany program.

Mój problem zapewne spowodowany jest moim nierozumieniem niektórych podstaw progrmowania obiektowego ale opiszę go w kontekście mojego zadania.

Mam:

  • algorytm, który liczy, czasami długo
  • Qt: okno, a w nim guziki, labele, glWidget i inne

Do jegnego guzika "podpiąłem" funkcję, która inicjalizuje wyświetlanie i algorytm, do drugiego -- jedna iteracja algorytmu, do trzeciego -- pętla, w której wykonuje się wiele razy to, co pod drugim guzikiem.
Wszystko robilem na wzór przykładowej aplikacji z tutoriala Qt. Wszystkie widgety, i obiekt "zajmujący się" algorytmem tworzę (moj_obiekt = new Moja_klasa) w funkcjach należących do klasy Window (okno aplikacji): widgety w konstruktorze, algorytm w slocie guzika inicjującego.
Oczywiście problem w tym, że na czas wykonywania algorytmu okno aplikacji jest nieużywalne. Doszedłem już do tego, że należy utworzyć wątek. Jest to kolejny obiekt.

Trzeba zaimplementować void JakiśThread::run(). Z tego run() chcę uruchomić Window::doStep(), który jest slotem jednego z guzików oraz mieć dostęp do innych widgetów okna. Próbowałem stworzyć obiekt klasy JakiśThread tak, jak obiekt algorytmu ale nie umiałem się z run() odwołać do widgetów i funkcji doStep().
Czy można to jakoś łatwo zrobić? Być może struktura mojego programu jest bardzo nieodpowiednia i można to zrobić lepiej. Jeżeli tak, bardzo proszę o sugestie.

PS. Toolkit i sposób wyświetlania danych (u mnie OpenGL) mogłem wybrać dowolny. Zdecydowałem się na Qt i OpenGL, bo po słyszałem, że to łatwe. Do Qt nie nie znalazłem niczego prócz specyfikacji i tutoriala od producenta, a to okazuje się dosyć trudne dla osoby z moją wiedzą.

0

Wątek jest zbędny. Ogólna zasad jest taka:

  1. wykonaj kilka kroków obliczeniowych
  2. pokaż wynik obliczeń
  3. daj odetchnąć aplikacji, aby przetworzyła różne zdarzenia (odrysowanie okna, kliknięcia myszką itp.)
  4. Idź do 1

Niestety w qt nie wiem jak zrealizować pkt 3, może jakiś timer czy jakieś message (w qt pewnie jest jakaś pętla komunikatów, albo coś na kształt), ktoś inny musi się wypowiedzieć.

0

Dzięki za odpowiedź.

Jeden krok może trwać sekundę lub dłużej, po każdym kroku muszą być aktualizowane labele i GLWidget (z tym akurat nie ma problemu). Też nie chciałbym się zagłębiać w wątkowanie, ale jak inaczej umożliwić użytkownikowi przerwanie działania algorytmu?

0

No to masz do wyboru 2 sposoby: bez wątku, ale aplikacja reaguje co sekundę, albo z wątkiem ale potrzebna synchronizacja.
A jeśli algorytm liczący jest rekurencyjny, to jesteś skazana na wątek (rekurencję można zamienić na iterację + stos).

0

Wątek już działa ale trzeba jakoś odśwież widgety. Zrobiło mi się coś mniej więcej takiego: http://lists.trolltech.com/qt-interest/2005-05/msg00702.html

"See QApplication::postEvent." Zobaczyłem i nie wymyśliłem, jak to zastosować u mnie.

Oj skomplikowane jest programowanie obiektowe...

Ha! Można zrobić komunikację poprzez sygnały i sloty i działa! Dzięki za zainteresowanie moim problemem. Pozdrawiam.

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