2010-01-28 16 views
16

Nie mogę wydawać się być w stanie powiązać QtConcurrent::run() z metodą (członkiem funkcji klasy) tylko z prostą funkcją. Jak mogę to zrobić?jest możliwe użycie QtConcurrent :: run() z członkiem funkcji klasy

Przy zwykłej funkcji nie mogę emitować sygnałów i jest to opór. Dlaczego ktokolwiek znalazłby lepszą alternatywę dla QThread jest poza mną i chciałby trochę danych wejściowych.

+0

Należy zauważyć, że jednocześnie może emitować sygnał w wątku, przy użyciu metody, nie może tworzyć widgety. Może to być tylko główny wątek GUI. Ponadto główny wątek GUI prawdopodobnie będzie musiał przetworzyć sygnał. – CodeLurker

Odpowiedz

19

Tak, jest to możliwe (i dość łatwe).

Oto przykład (z dokumentacji Qt):

// call 'QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const' in a separate thread 
QString string = ...; 
QFuture<QStringList> future = QtConcurrent::run(string, &QString::split, QString(", "), QString::KeepEmptyParts, Qt::CaseSensitive); 
... 
QStringList result = future.result(); 

Zasadniczo, wszystko co musisz zrobić, to przekazać wskaźnik do obiektu jako pierwszy argument i adres metody jako drugi argument (następnie inne argumenty).

Patrz: https://doc.qt.io/qt-5/qtconcurrentrun.html

+1

Jeden rzeczą, która kosztowała mnie trochę czasu jest to, że QtConcurrent nie lubi przeciążonych funkcji: D – hakermania

+0

'podaj wskaźnik '- zauważ, że' ciąg' w twoim przykładzie nie jest (ale powinien być, jak sądzę);) – mlvljr

5

Problem polega na tym, że podczas używania wskaźnika do funkcji elementu należy również podać parametr this (tj. Obiekt, na którym powinna zostać wywołana funkcja składowa).

Składnia tego jest dość trudna, jeśli wcześniej jej nie używałeś. Dobrze byłoby przeczytać http://www.parashift.com/c++-faq-lite/pointers-to-members.html.

Załóżmy, że masz klasę Dog i funkcję Dog::walkTheDog(int howlong_minutes). Następnie powinieneś być w stanie korzystać std::bind1st i std::mem_fun, aby nadawał się do QtConcurrent::run:

Dog dog; 
// Walk this dog for 30 minutes 
QtConcurrent::run(std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog), 30); 

std::bind1st(std::mem_fun(&Dog::walkTheDog), &dog) zwraca obiekt funkcji podobny który związał funkcji użytkownika do konkretnego psa. Od tego momentu możesz go używać tak, jakbyś mógł używać funkcji samodzielnej.

+0

Czy możesz spojrzeć na to pytanie, mam taki problem, https: //stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent? Noredirect = 1 # comment82546866_47792153 –

Powiązane problemy