Seite 1 von 1

Member Functions in QtConcurrent::blockingMap(...)

Verfasst: 24. September 2009 08:56
von N¤X
Hallo,

ich schreibe grad an was wofür ich blockingMap verwenden wollte. Funktioniert auch prinzipiell, nur will ich das innerhalb einer Klasse verwenden, und das wiederum bringt mir nur einen verwirrenden compile time error.
Ich habe mich eigentlich an die Qt Dokumentation gehalten (hier), aber irgendwas scheine ich falsch zu machen. Hier ein minimales Beispielprogramm, bei dem der selbe Fehler auftritt:

Code: Alles auswählen

#include <QtCore>

class Testclass {
public:
  Testclass() {
    QList<int> integers;
    integers << 0 << 1 << 2 << 3 << 4;
    QtConcurrent::blockingMap(integers, &Testclass::mapfunction);
  }
private:
  void mapfunction(int &number) {
    number++;
  }
};

int main(int argc, char * argv[]) {
  QCoreApplication app(argc, argv);

  Testclass testinstance;

  return app.exec();
}
Der Fehler:

Code: Alles auswählen

c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/concurrent/qtconcurrentmapkernel.h: In member function `bool QtConcurrent::MapKernel<Iterator, MapFunctor>::runIteration(Iterator, int, void*) [with Iterator = QList<int>::iterator, MapFunctor = void (Testclass::*)(int&)]':
main.cpp:12:   instantiated from here
c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/concurrent/qtconcurrentmapkernel.h:73: error: must use .* or ->* to call pointer-to-member function in `((QtConcurrent::MapKernel<QList<int>::iterator, void (Testclass::*)(int&)>*)this)->QtConcurrent::MapKernel<QList<int>::iterator, void (Testclass::*)(int&)>::map (...)'
Kompiliert hab ich mit Qt 4.5.2 und MinGW unter Windows XP.

Was mache ich falsch?

Verfasst: 24. September 2009 09:07
von Christian81
Als erste Idee ohne weiter nachzudenken - mapfunction muss static sein sonst kannd er Compiler keine Adresse von bilden.

Verfasst: 24. September 2009 12:00
von N&#164;X
Thx, jetzt tuts :)
komisch, ich glaub ich hab schonmal QtConcurrent::run(...) mit ner member function benutzt und da hats glaub ohne static getan, aber täusch ich mich auch nur...

Aber geht das auch irgendwie ohne static? Das soll halt ne Klasse sein die ein paar Daten (hauptsächlich zwei QImages) in Membervariablen hat und diverse Funktionen bereitstellt die dann auf diesen Bildern arbeiten, und das geht mit statischen Funktionen nicht so gut.
Wenn ich jetzt bei jeder multigethreadeten Funktion extra nen Pointer auf die Daten mitübergeben muss hätt ich mir das Klassenmachen auch sparen können, als eigene Klasse mit ihren eigenen Operatoren fänd ichs aber schöner :/

Also geht das multithreaden innerhalb einer Klasse auch irgendwie ohne statics? *hoff*

Verfasst: 24. September 2009 12:03
von Christian81
Nein - wie schon gesagt kann der Compiler keine Adresse auf eine nicht-statische Memberfunktion bilden (wie sollte das gehen?)

Verfasst: 24. September 2009 12:21
von N&#164;X
hm, ok, dann kann ich das hier wohl leider nicht so verwenden wie ich gerne würde...
*denk*
Anderer Ansatz neues Problem: Kann ich aus nem Haufen Scanlines (QRgb*) wieder ein Bild zusammenstückeln, möglichst ohne irgendwelche Daten kopieren zu müssen? Soweit ich das verstanden hab müssen die Scanlines bei nem QImage (leider) am Stück und in der richtigen Reihenfolge im Speicher stehen, oder ist dem nicht so?