Objekte für QtConcurrent::map()

Alles rund um die Programmierung mit Qt
Antworten
ObDasSogeht
Beiträge: 2
Registriert: 3. Februar 2012 11:12

Objekte für QtConcurrent::map()

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

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

Beitrag 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.
ObDasSogeht
Beiträge: 2
Registriert: 3. Februar 2012 11:12

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

Beitrag 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.
Antworten