2009-01-08 6 views
0

Je développe une application cacao qui télécharge le firmware sur l'appareil. La progression du téléchargement est affichée à l'aide de NSProgressIndicator. J'appelle la méthode -incrementBy: de NSProgressIndicator après la méthode DeviceRequestTO dans une boucle while. Mais l'indicateur de progression n'est mis à jour qu'une fois que le microprogramme entier a été écrit sur l'appareil. Il montre 100% d'achèvement en une seule fois. J'ai donc ajouté la méthode -displayIfNeeded de la classe NSView. Maintenant, il montre des progrès en douceur, mais cela se produit aussi une fois le téléchargement du firmware est terminé. Comment puis-je obtenir l'indication de progression et l'opération d'écriture simultanément?Mise à jour de l'indicateur de progression lors du téléchargement du firmware sur l'appareil

Voici le code:

while(1) 
{ 
    int result = (*dev)->DeviceRequestTO(dev, &request); 
    printf("\nBlocks Written Successfully: %d",DfuBlockCnt); 
    [refToSelf performSelectorOnMainThread:@selector(notifyContent) 
         withObject:nil 
         waitUntilDone:NO]; 
} 

//In main thread 
- (void)notifyContent{ 
    [dnldIndicator incrementBy:1]; 
    [self displayIfNeeded]; 
} 
+0

Cette méthode est-elle dans un thread séparé? Si c'est le cas, vous devez mettre à jour l'interface utilisateur à l'aide de -performSelectorOnMainThread: pouvez-vous publier votre code? –

Répondre

5

La méthode que vous devez appeler est setNeedsDisplay:, pas displayIfNeeded. Ce dernier signifie "envoyez-vous display si quelqu'un vous a envoyé setNeedsDisplay:YES". Si vous ne faites pas cette dernière partie, la vue ne sait pas qu'elle doit s'afficher et displayIfNeeded ne fera rien.

Et une fois que vous avez ajouté le message setNeedsDisplay:, vous pourrez peut-être découper le message displayIfNeeded, car l'infrastructure envoie ce message à la fenêtre (et, par conséquent, à toutes ses vues) périodiquement de toute façon.

0

Votre code ressemble exactement à celui que j'utilise pour mettre à jour UIProgressIndicators et NSProgressIndicators sur le Mac et l'iPhone, un code qui fonctionne parfaitement pour moi. Je suppose, comme menumachine, que votre boucle while existe sur un thread d'arrière-plan (créé en utilisant performSelectorInBackground: withObject: ou detachNewThreadSelector de NSThread: toTarget: withObject :).

Les valeurs minValue et maxValue de l'indicateur de progression sont-elles correctement définies (0 et 100 ou quelle que soit votre taille)?

À quelle fréquence les mises à jour se produisent-elles? Peut-être que vous envoyez trop d'événements trop rapidement et l'interface n'a pas l'occasion de mettre à jour correctement.

Ce code devrait fonctionner, autant que je sache.

Questions connexes