Bonjour à tous,

Je viens vers vous car j'ai besoin d'aide pour réaliser du multiThreading afin d'empêcher les annonces VoiceOver de se couper.

Je parle des annonces VoiceOver de ce type : UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, NSString*);


Pour l'instant ce que j'ai essayé de faire c'est
AnnouncingTread.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#import <Foundation/Foundation.h>
 
//#import <Slt/Slt.h>
//#import <OpenEars/FliteController.h>
@interface AnnouncingThread : NSObject {
  //  FliteController *fliteController;
   // Slt *slt;
}
@property (nonatomic) NSLock *myMutex;
@property (nonatomic) NSMutableArray* myAnnouncingArray;
 
//@property (strong, nonatomic) FliteController *fliteController;
//@property (strong, nonatomic) Slt *slt;
- (id) initMyThread: (NSMutableArray*) announcingArray;
@end
AnnouncingTread.m
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
#import "AnnouncingThread.h"
 
@implementation AnnouncingThread
@synthesize myMutex;
@synthesize myAnnouncingArray;
//@synthesize fliteController;
//@synthesize slt;
- (id) initMyThread : (NSMutableArray*) announcingArray{
 
    myAnnouncingArray = announcingArray;
    //int y;
    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
 
 
    return self;
}
 
-(void) run{
	// Ceci est la méthode appelée par la thread créée
    while (myAnnouncingArray.count >0) {
	{
        [myMutex lock];
        NSLog(@"%@\n",(NSString *)[myAnnouncingArray objectAtIndex:0]);
        UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, (NSString *)[myAnnouncingArray objectAtIndex:0]);
      // [self.fliteController say:(NSString *)[myAnnouncingArray objectAtIndex:0] withVoice:self.slt];
        usleep(100);
        [myAnnouncingArray removeObjectAtIndex:0];
          NSLog(@"%i\n",[myAnnouncingArray count]);
        [myMutex unlock];
    }
    }
 
   // exit(0);
}
et j'appelle le tout comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
myAnnouncingThread = [AnnouncingThread alloc];
[myAnnouncingThread setMyMutex:myMutex];
//[myAnnouncingThread setFliteController:fliteController];
//[myAnnouncingThread setSlt:slt];
myAnnouncingThread =[myAnnouncingThread initMyThread: announcingArray];

Pour l'instant ça ne lit que le dernier NSString du NSMutableArray. Et même celui ci est coupé par le focus de voiceOver qui se positionne sur un nouvel endroit quand on change de page.

Est ce que quelqu'un pourrait m'aider?

Pour mieux situer mon problème :
Concrètement, le but final serait de faire un thread avec plusieurs listes de strings en fonction de la priorité de l'annonce. On pourra ajouter à ces listes toutes les annonces que l'on souhaite diffuser à tout moment.
Le thread lira d'abord les annonces les plus prioritaires et ensuite les moins prioritaires (si il y avait des paramètres dans l'annonce, elle sera mis à jour au moment de l'annonce pour ne pas avoir d'annonces révolues).
Aussi, ce qui serai bien ce serait d'éviter d'utiliser VoiceOver mais un TTS.