Wywoływanie cykliczne funkcji. Funkcja update okna.

0

Witam,
Mam trochę takie banalne pytanie, ale mnie to blokuje.

void Update()
{
    if(buttonExitClicked)
    {
        close();
    }
    else if(buttonDrawClicked)
    {
        draw();
    }
    else if(jakisBool)
    {
        mojaFunkcja();
        jakisBool = false;
    }
}

Może wyjaśnię to na przykładzie tej funkcji. Przytoczona przeze mnie funkcja włącza się przy odpaleniu programu i działa sobie w nieskończoność, czekając na wciśnięcie jakiegoś buttona i wykonanie danej funkcji.

I tu nasuwa się moje pytanie.
Czy aby w QT zrobić funkcję działającą na podobnej zasadzie muszę ustawić updatesEnabled na true i przeciążyć void QWidget::update(), aby dodać jakiś swój warunek, który będzie sprawdzany cały czas? Czy to jakoś inaczej się robi?
Chodzi mi o to, że jak funkcja pod jakimś buttonem zmieni jakąś wartość boolowską, to funkcja będzie działała tak jak funkcja, którą napisałem wyżej.

2

Nie wiem co robisz, ale robisz to źle i chcesz by naprawić zły pomysł.
To się nazywa Problem XY i dopóki nie wyjaśnisz czym jest X nie mam zamiaru pomagać w naprawianiu Y.

0

No rzeczywiście może nie wyszło mi tłumaczenie.
Chcę pobierać z urządzenia dane po naciśnięciu buttonaDraw(ustawienie globalnej zmiennej isClickedToDraw na true) i rysowaniu wykresów tak jakby w czasie rzeczywistym. Ponowne kliknięcie buttona powoduje ustawienie globalnej zmiennej isClickedToDraw na false i przerwanie rysowania i pobierania danych.
Mój problem polega na tym gdzie nie wiem dokładnie gdzie mam umieścić

if(isClickedToDraw)

Możliwe, że źle rozumiem, bo pisząc grę w unity w C# miałem funkcje start(), która wykonywała się przy uruchomieniu programu i funkcję update(), która wykonywała się cały czas i w niej umieszczałem takie ify.
A w Qt nie wiem gdzie mogę to umieścić.

2

Zmienna globalna == błędy

Źle to napisałeś.
Powinno iść w ten deseń (ponieżej ejst elpiej co masz ale nadal jest ułomne):

  1. sygnał z buttona wywołuje metodę z klasy Model (nazwa robocza)
  2. Model wysyła na urządzenie co ma wysłać
  3. Urządzenie wysyłą sygnał o nowych danych, Model to odbiera
  4. Model aktualizuje swoje dane wewnętrzne i wysyła o tym sygnał
  5. MainWidnow odbiera sygnał i aktualizuję serię danych

Generalnie wszystko masz robić na sygnałach i slotach. Jeśli masz repo na github lub bitbucket to podaj linka, może na to popatrzę wieczorem.

0

Znaczy jeżeli to dobrze rozumiem to co opisałeś to jest działanie jak normalnie działa button.
A mi chodzi o to, że klikam przycisk raz i cały czas urządzenie przesyła jakieś dane i okno to cały czas nanosi na wykres, a w dodatku w między czasie mogę klikać sobie inne przyciski, no i oczywiście buttona do przerwania rysowania.
Nie wiem jak to ująć, no może jak jakiś odtwarzacz filmów klikam start i film sobie leci, mogę zmieniać jakieś ustawienia w czasie tego i zatrzymać film. Coś takiego chciałbym umieć zrobić.

Repa jako takiego nie mam, bo na razie się tego uczę i jak coś nowego robię to sobie robię nowy projekt gdzie sobie opisuje dokładnie się dzieje i mam tam kilka linijek kodu, więc to raczej będzie zbędne.
Ale wielkie dzięki za chęci :D

0

Zauważ, że punk 3 sam się ponownie uruchamia. Wszystko rozbija się o detale, dlatego proponuje pokazanie repo.

Jak się komunikujesz z urządzeniem?

0

Przez USB.

libusb_control_transfer()
1

Może spróbuj za pomocą klasy QTimer? Wciskając przycisk ustawiasz np timer przez który jest wywoływana jakaś funkcja okresowo.

0

Okresowo w senie, że tylko ona np przez 10sek co 0.1s się włącza i okno jest zamrożone, czy przez 10 sek co 0.1 się uruchamia, ale z okna można normalnie korzystać?

1

W sensie, że działa w tle w nieskończoność z częstotliwością jaką sobie ustawisz. Tak z okna można dalej korzystać, ale weź pod uwagę, że jeśli program będzie chodzić na jednym wątku, a częstotliwość ustawisz 100 razy na sekundę, to taka funkcja może się gryźć z innymi

0

Może troszkę konkretniej jak wygląda a komunikacja?
Pokaż kod. Masz to odseparowane do innej klasy?

@Draaz timer? naprawdę?

0

A dlaczego nie? Jeśli ma być to okresowe wywoływanie to moim zdaniem się nadaje, chyba że nie zrozumiałem do końca problemu

0

@MarekR22 no do tej funkcji przesyłam konkretne rejestry, wskaźnik na urządzenie i urządzenie odpowiada(każde wywołanie to jedna odpowiedź, nie odpowiada cały czas, muszę to wymusić).

Właśnie przez te wymuszenia wydaje mi się że QTimer może się nadać.

0

Ja trochę nie rozumiem szczerze mówiąc, potrzebujesz czegoś co się wywołuje okresowo z jakąś częstotliwością czy może czegoś co się wywoła po otrzymaniu konkretnego komunikatu?

2

QTimer owszem zadziała, ale zależnie od tego jaką ilość danych ściągasz będzie albo za powolny, albo za szybki.
Ryzykujesz, że aplikacja będzie dawała wrażenie ociężałej, albo dane nie będą się wyświetlać na bieżąco.

X lat temu robiłem dokładnie takie rzeczy, ściągałem dużą ilość danych przez jakieś dziwne złącze (GPIB) albo przez USB, albo przez (COM).
Wtedy używałem VISA (Virtual Instrument Software Architecture) od National Instruments. Fajna biblioteka, bo dostarczało abstrakcję na wiele urządzeń, na dodatek uprzędzenia nie musiały być podłączone bezpośrednio do komputera z aplikacją, ale można było udostępniać je przez sieć.

0

Ale to jest spowodowane tylko tym, że po prostu funkcja może potrzebować czasu na pobieranie danych/jakieś obliczenia i dlatego nie wyświetli ich na bieżąco czy samo wywoływanie jej przez timer powoduje jakieś opóźnienia/większe obciążenia?

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