• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++/Qt] Wstrzymywanie działania wątków

+1 głos
335 wizyt
pytanie zadane 21 czerwca 2017 w C i C++ przez wanttobeanengineer Obywatel (1,120 p.)

Witam wszystkich,

Napisałem aplikację (oczywiście na podstawie tutoriala na YT, bo wątki dopiero ruszyłem), która umożliwia uruchomienie wątku po naciśnięciu buttona, zatrzymanie go po naciśnięciu innego, jednak chciałbym jeszcze dodać funkcjonalność wsztrzymania działania wątku - zapauzowania go (o ile jest taka możliwość).

W skrócie, aplikacja ta odlicza od 0 do 999 co 0.1 sekundy a wyniki odliczania wyświetla w label.
 

 for(int i=0; i<1000; i++)
    {
        if(this->Stop) break;
        emit NumberChanged(i);
        this->msleep(100);
    }

Stop to flaga, jeśli przyjmie wartość true (po naciśnięciu przycisku 'Zatrzymaj') to przerwie działanie pętli.

Co do pauzowania, mam pewien pomysł, ale zastanawiam się, czy nie można tego zrobić inaczej (lepiej), czy nie ma do tego specjalnej metody.

 for(int i=0; i<1000; i++)
    {
        if(this->Stop) break;
        while(this->Pause);
        emit NumberChanged(i);
        this->msleep(100);
    }

Oczywiście i tutaj Pause jest flagą, domyślnie ustawioną na 'false', po naciśnięcu przycisku ustawiana jest na 'true' i wtedy leci pętla w nieskończoność aż użytkownik naciśnie przycisk 'Start', gdzie po tym zdarzeniu flaga ta zostanie ustawiona ponownie na 'false' i przerwie działanie pętli while.

Pozdrawiam.

4 odpowiedzi

+1 głos
odpowiedź 21 czerwca 2017 przez tangarr VIP (138,360 p.)

Proponuję użyć mutexa
 

for(int i=0; i<1000; i++)
{
    this->mutex->lock(); //Wątek przejdzie dalej tylko wtedy gdy mutex nie został zablokowany w innym miejscu programu
    this->mutex->unlock();
    emit NumberChanged(i);
    this->msleep(100);
}

 

0 głosów
odpowiedź 21 czerwca 2017 przez j23 Mędrzec (175,020 p.)

Do pauzowania użyj atomic_bool:

atomic_bool pause_lock(false);
...


for(int i=0; i<1000; i++)
{
	while(pause_lock) 
		this_thread::sleep_for(1ms); 
		
    emit NumberChanged(i);
    this->msleep(100);
}


// gdzieś tam

pause_lock.store(true); // pause on

pause_lock.store(false); // pause off

 

0 głosów
odpowiedź 21 czerwca 2017 przez wanttobeanengineer Obywatel (1,120 p.)
Mutexy, atomic_bool, jakieś inne propozycje?
Dyskusja twórcza mile widziana.

I dziękuję za odpowiedzi.
1
komentarz 21 czerwca 2017 przez j23 Mędrzec (175,020 p.)

Mutexy wywal z tej (krótkiej) listy, bo one nie służą do tego typu zastosowań. A jeśli już, to w parze z condition variable, choć nie jestem pewien, czy ten sposób synchronizacji pasuje do tego, co chcesz zrobić.

 

Nie sądzę też, żebyś dostał inne propozycje zgoła inne niż to, co już dostałeś.

0 głosów
odpowiedź 21 czerwca 2017 przez Bondrusiek Maniak (61,170 p.)

Witam,

czym według Ciebie różni się zatrzymanie wątku od jego wstrzymania. Widzę, że bazujesz na tutorialu Bryan'a VoidRealms. Z tego co pamiętam(z tutorialu) oraz widzę(z dokumentacji) to nie da się wstrzymać. Moim zdaniem najlepszym wyborem jest nie zamykanie wątku lecz stworzenie flagi (tutaj this->stopped), która ma za zadanie pominięcie tej operacji, którą wykonuje wątek plus dodanie mu najmniejszego priorytetu za pomocą metody

void QThread::setPriority(Priority priority)

 

Klasa QMutex jest wykorzystywana gdy wiele wątków działa na jednej zmiennej. Zadaniem tej klasy jest dbanie by tylko jeden wątek mógł działać na danym fragmencie kodu. Więc w tym przypadku średnio Ci się sprzyda.

Tu masz dokumentacje QThread: http://doc.qt.io/qt-5/qthread.html

Interesujące z Twojej potrzeby wydaje się void exit() oraz bool wait()

Pozdrawiam

Podobne pytania

0 głosów
3 odpowiedzi 154 wizyt
0 głosów
1 odpowiedź 387 wizyt
pytanie zadane 1 grudnia 2016 w Java przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 714 wizyt

88,328 zapytań

136,921 odpowiedzi

305,575 komentarzy

58,600 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...