2010-04-05 24 views
0

récemment J'ai démarré un projet qui peut exporter des fichiers Grafix/Audio précalculés vers des fichiers, après traitement.Problème de mémoire de feuille et de fil

Tout ce que je faisais est de mettre une nouvelle fenêtre (avec progressindicator et un bouton Abandonner) dans mon principal xib et ouvert en utilisant le code suivant:

[NSApp beginSheet: REC_Sheet modalForWindow: MOTHER_WINDOW modalDelegate: self didEndSelector: nil contextInfo: nil]; 

NSModalSession session=[NSApp beginModalSessionForWindow:REC_Sheet]; 
RECISNOTDONE=YES; 
while (RECISNOTDONE) { 
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse) 
     break; 
    usleep(100); 
} 

[NSApp endModalSession:session]; 

Brodeuses de fond (pthread) a été commencé plus tôt , pour effectuer le travail et sauvegarder tous les fichiers targas/wave. Ce qui a bien fonctionné, mais après un certain temps, il s'est avéré que le fil principal ne répondait plus et que mon empreinte mémoire augmentait de façon irrépressible. J'ai essayé de le déboguer avec des Instruments, et j'ai vu beaucoup de trucs de CFHash etc grandissant à l'infini.

Par accident, j'ai cliqué en dessous de la feuille, et temporaire il a aidé, le fil principal (AppKit?) Libérait ses affaires, mais juste pour un peu de temps.

Je ne peux pas m'expliquer, tout d'abord je pensais que c'était l'accès de mon thread au Progressbar pour mettre à jour le Progress (cadencé à 0,5sec), alors je l'ai découpé. Mais même si je ne suis pas en train de mettre à jour quoi que ce soit et que je n'ai rien fait avec le Progressbar, mon application consomme toute la mémoire, car elle ne libère pas son "Main Event" ou quoi que ce soit.

Y a-t-il une possibilité de "drainer" ce truc principal de mémoire de thread (appel Runloop/NSApp?). Et pourquoi diable le fil principal ne répond plus (après cette simple tâche) ???

Je n'ai plus de clou, merci de nous aider!

Merci d'avance!

P.S. Comment les gars mettent-ils en œuvre "Stuffed long task" Stuff et mettre à jour votre gui ??

+0

Dans Instruments, voir ce qui alloue les CFHashes. –

Répondre

1
while (RECISNOTDONE) { 
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse) 
     break; 
    usleep(100); 
} 

Y at-il une raison que vous faites cela? Une feuille va bloquer sa fenêtre parente sans que vous ayez à faire quelque chose comme ça. Vous pouvez empêcher la fermeture de votre délégué d'application.

Si vous avez vraiment besoin du code ci-dessus pour quelque chose, essayez de créer un pool autorelease avant d'envoyer le message runModalSession:, puis de le vider après (mais avant de le comparer à NSRunContinuesResponse et de rompre).