skalieren mit mehreren threads?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • skalieren mit mehreren threads?

    hallo

    mir ist da irgendwie ein Problem auf die Füße gefallen...
    ich hab einen Thread der mittels dieser Zeilen Bitmaps skaliert:

    Quellcode

    1. NSImage *img = [[NSImage alloc] initWithContentsOfFile:picturePath];
    2. NSImage *scaleImg = [[NSImage alloc] initWithSize:size];
    3. [scaleImg lockFocus];
    4. [img drawInRect:NSMakeRect(0.0,0.0,size.width,size.height)
    5. fromRect:NSMakeRect(0.0,0.0,[img size].width,[img size].height)
    6. operation:NSCompositeCopy fraction:1.0];
    7. [scaleImg unlockFocus];
    8. NSBitmapImageRep *tempRep = [NSBitmapImageRep imageRepWithData:[scaleImg TIFFRepresentation]];


    da das auch realtiv viele werden können und vor allem auch in unterschiedlichen ausgangshirachien dacht ich mir in meinem wahn das man im zeitalter von multicore und dualcpu systemen ja das eine wenig aufpeppen kann und mehrere threads dazu benutzen könnte...

    nur macht mir irgendwie, wie mir scheint, apple da einen strich durch die Rechnung?

    letztlich bleibt mein Program in einem quasie Deadlock hängen und nach analyse im debugger

    hängen alle meine workerthreads im skalieren an folgender oder ähnlicher stelle fest:

    #0 0x9002c548 in semaphore_wait_signal_trap
    #1 0x9003102c in pthread_cond_wait
    #2 0x92be0bcc in -[NSRecursiveLock lock]
    #3 0x93838a64 in _NSAppKitImgCacheLock
    #4 0x937f3928 in _NXFreeImageCache
    #5 0x937f2d88 in -[NSCachedImageRep draw]
    #6 0x93806c24 in -[NSImage drawInRect:fromRect:operation:fraction: ]
    #7 0x00035020 in -[PictureNode createScaledBitmapWithSize: ] at PictureNode.m:64
    #8 0x0005f3dc in -[PoolManager workToScale: ] at PoolManager.m:165
    #9 0x92be11a0 in forkThreadForFunction
    #10 0x9002be88 in _pthread_body

    mir deucht das alle dieses gleiche ominöse cache objekt benutzen?
    muß ich mir eine eigene skalierungsroutine bauen? *grusel*

    oder muß ich - obwohl jeder thread mit eigenen daten arbeitet - trotzdem sämtliche bitmapdaten operationen die in den CG / Appkitt reinlaufen mit eigenen locks schützen?

    kann mich da jemand schlau machen?

    danke

    chartus
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!