• 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

VPS Starter Arubacloud
+1 głos
401 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 Mędrzec (154,780 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 (194,920 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 (194,920 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,370 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 271 wizyt
0 głosów
1 odpowiedź 425 wizyt
pytanie zadane 1 grudnia 2016 w Java przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 913 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...