2010-01-28 6 views
16

Ich kann nicht QtConcurrent::run() mit einer Methode (Funktion Member einer Klasse) nur mit einer einfachen Funktion zu verknüpfen scheinen. Wie kann ich das machen?ist es möglich, QtConcurrent :: run() mit einem Funktionsmember einer Klasse

Mit einer normalen Funktion kann ich keine Signale aussenden und es ist ein Widerstand. Warum sollte jemand finden, dass dies eine bessere Alternative zu QThread ist über mich hinaus und möchte einige Eingabe.

+0

Beachten Sie, dass, während Sie ein Signal in einem Thread emittieren kann, entweder Methode verwenden, es Widgets nicht erstellt werden kann. Nur der Haupt-GUI-Thread darf. Außerdem wird der Haupt-GUI-Thread wahrscheinlich das Signal verarbeiten müssen. – CodeLurker

Antwort

19

Ja, das ist möglich (und ziemlich einfach).

Hier ist ein Beispiel ist (aus der Qt-Dokumentation):

// 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(); 

Grundsätzlich alles, was man zu tun hat, ist einen Zeiger auf das Objekt als erstes Argument und die Adresse des Verfahrens als zweites Argument übergeben (gefolgt von anderen Argumenten).

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

+1

One was mich einige Zeit kostete ist, dass QtConcurrent keine überladenen Funktionen mag: D – hakermania

+0

'pass a pointer' - beachte, dass' string' in deinem Beispiel nicht ist (sollte aber sein, denke ich);) – mlvljr

5

Das Problem ist, dass, wenn Sie einen Zeiger auf Member-Funktion verwenden, müssen Sie auch den this Parameter bereitstellen (d. H. Das Objekt, auf dem die Member-Funktion aufgerufen werden sollte).

Die Syntax dafür ist ziemlich schwierig, wenn Sie es vorher nicht benutzt haben. Es könnte gut sein, http://www.parashift.com/c++-faq-lite/pointers-to-members.html zu lesen.

Angenommen, Sie haben eine Klasse Dog und eine Funktion Dog::walkTheDog(int howlong_minutes). Dann sollten Sie in der Lage sein std::bind1st und std::mem_fun zu verwenden, um es für QtConcurrent::run geeignet zu machen:

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) gibt ein funktionsähnliche Objekt, das die Member-Funktion auf einen bestimmten Hund gebunden hat. Ab diesem Punkt können Sie es so verwenden, als könnten Sie eine eigenständige Funktion verwenden.

+0

können Sie bitte diese Frage betrachten, ich habe ein solches Problem konfrontiert, https: //stackoverflow.com/questions/47792153/invalid-use-of-non-static-member-function-qtconcurrent? Noredirect = 1 # comment82546866_47792153 –

Verwandte Themen