Seite 1 von 1

Objekte für QtConcurrent::map()

Verfasst: 6. Februar 2012 09:51
von ObDasSogeht
Hallo,
da auch die Suche leider nix brachte(oder man es nur nicht gefunden hat) hier die Anfrage,
welche Funktionen das Objekt in der übergeben Liste alles haben muss? (Ich vermute mal, das was fehlt.)
In Wirklichkeit sind hier natürlich noch mehr Variablen im Objekt drin, aber der Einfachheit halber, habe ich es
mal etwas gekürzt.

Die Klasse für das Objekt:

Code: Alles auswählen

class Testobjekt
{
    public:
		enum Status{OK,FEHLER,UNBEKANNT};
		Testobjekt(){}
		Testobjekt(const QString& eigenschaft)
		{K_Eigenschaft=eigenschaft;
		 K_Status=Testobjekt::UNBEKANNT;}
		const QString		&EigenschaftHolen()const{return K_Eigenschaft;}
		const Testobjekt::Status	&StatusHolen()const {return K_Status;}
		void			EigenschaftSetzen(const QString &text){K_Eigenschaft=text;}
		void			StatusSetzen(const Testobjekt::Status &status){K_Status=status;}
    private:
		QString			K_Eigenschaft;		
		Testobjekt::Status	K_Status;
};
Und hier der Code in meiner Klasse wo QtConcurrent::map() aufgerufen wird:
QList<Testobjekt> K_Testobjekte

Code: Alles auswählen

QFuture<void> Ergbnis=QtConcurrent::map(K_Testobjekte,&Hauptfenster::MacheWas);

void Hauptfenster::MacheWas(Testobjekt &welches)
{
   welches.StatusSetzen(Testobjekt::OK);
}
Beim übersetzten des ganzen beschwert sich der Compiler mit:
/../meins/include/QtCore/qtconcurrentmapkernel.h: In member function 'bool QtConcurrent::MapKernel<Iterator, MapFunctor>::runIteration(Iterator, int, void*) [with Iterator = QList<Testobjekt>::iterator, MapFunctor = QtConcurrent::MemberFunctionWrapper1<void, Hauptfenster, Testobjekt&>]':
Quellen/Hauptfenster.cpp:143: instantiated from here
../../meins/include/QtCore/qtconcurrentmapkernel.h:73: error: no match for call to '(QtConcurrent::MemberFunctionWrapper1<void, Hauptfenster, Testobjekt&>) (Testobjekt&)'
../../meins/include/QtCore/qtconcurrentfunctionwrappers.h:138: note: candidates are: T QtConcurrent::MemberFunctionWrapper1<T, C, U>::operator()(C&, U) [with T = void, C = Hauptfenster, U = Testobjekt&]
In der Doku ist leider nur ein Beispiel mit QImage zu sehen.

Ich wünsche euch schon mal einen schönen Montag.

Re: Objekte für QtConcurrent::map()

Verfasst: 6. Februar 2012 10:56
von franzf
HauptFenster::MacheWas() ist nicht static, oder?
Es gibt 3 Möglichkeiten, QtConcurrent::map zu verwenden:
1) freie Funktion: Die Funktion ist nicht Member einer Klasse. map() erwartet, dass die Funktion mit einem Parameter kompatibel zum Typ im übergebenen Container.
Beispiel:

Code: Alles auswählen

QVector<TestTyp> vec;
void funktion(TestTyp&);
2) statische Memberfunktion: Der Klassentyp ist EGAL, an die Funktion werden die selben Bedingungen wie in 1) gfordert.
Beispiel:

Code: Alles auswählen

QVector<TestTyp> vec;
struct Tester {
    static void funktion(TestTyp&);
};
3) nichtstatische Memberfunktion: der Klassentyp muss dem im übergebenen Container entsprechen, die Funktion erwartet KEINE Parameter!
Beispiel:

Code: Alles auswählen

struct TestTyp {
    void funktion();
};
QVector<TestTyp> vec;
Ein Beispiel mit 2) und 3):

Code: Alles auswählen

#include <QtConcurrentMap>
#include <QVector>

struct Test {
    int val;
    void change() {
        val = 100;
    }
};

struct Tester {
    void change1(Test& t) {
        t.val = 101;
    }
    static void change2(Test& t) {
        t.val = 102;
    }
};

int main() {
    QVector<Test> v(100);
    QFuture<void> fut1 = QtConcurrent::map(v, &Test::change);
    
    QFuture<void> fut2 = QtConcurrent::map(v, &Tester::change1);
    
    QFuture<void> fut3 = QtConcurrent::map(v, &Tester::change2);
}
fut1 und fut3 funktionieren, fut2 ist das wie du es machst -> Fehler! Wenn du die Zeile auskommentierst, kompiliert das Programm.

Re: Objekte für QtConcurrent::map()

Verfasst: 6. Februar 2012 14:32
von ObDasSogeht
Nee MacheWas() ist nicht statisch.
Aber ich habe das jetzt statisch gemacht und siehe da, es geht..))
Danke schon mal für die Hilfe.