[Carbon] CFNotificationCenter Callback
Eddy58
Membre
Bon, mes connaissances en Carbon relevants du strict minimum :P, j'ai un petit problème pour faire fonctionner la fonction Callback appelée par la fonction CFNotificationCenterAddObserver. Après tout le code d'initialisation, qui est simplement le template d'XCode à la création du projet, je crée l'observateur avec AddObserver, ensuite je poste une notification à destination d'une appli pure Cocoa elle (c'est tellement plus simple !), ensuite cette appli renvoie une notification à l'appli Carbon émettrice comme quoi les données sont bien reçus, mais voilà la fonction Callback ne m'affiche pas le printf() de test. La notification de retour est pourtant bien postée par l'appli Cocoa (j'ai vérifié avec Notification Watchers), mais dans l'immédiat je vois pas pourquoi le code test Carbon ne reçoit rien.
Est-ce que j'ai mal configuré ma fonction AddObserver ?
Ou alors est-ce que la fonction RunApplicationEventLoop() est inappropriée au contexte et bloque ainsi le Callback, donc dans ce cas que faudrait-il mettre afin d'avoir une simple attente de la notification de retour ?
Si quelqu'un connaissant Carbon a une quelconque idée, je suis preneur de toute info. :why?:
[tt]
void MyCallBack(CFNotificationCenterRef center,void *observer,CFStringRef name,const void *object,CFDictionaryRef userInfo);
int main(int argc, char* argv[])
{
  IBNibRef nibRef;
  WindowRef window;
 Â
  OSStatus err;
  // Create a Nib reference passing the name of the nib file (without the .nib extension)
  // CreateNibReference only searches into the application bundle.
  err = CreateNibReference(CFSTR("main"), &nibRef);
  require_noerr( err, CantGetNibRef );
 Â
  // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
  // object. This name is set in InterfaceBuilder when the nib is created.
  err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar"));
  require_noerr( err, CantSetMenuBar );
 Â
  // Then create a window. "MainWindow" is the name of the window object. This name is set in
  // InterfaceBuilder when the nib is created.
  err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window);
  require_noerr( err, CantCreateWindow );
  // We don't need the nib reference anymore.
  DisposeNibReference(nibRef);
 Â
  // The window was created hidden so show it.
  ShowWindow( window );
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
   NULL,
   MyCallBack,
   CFSTR("ReceiptNotification"),
   NULL,
  CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),CFSTR("SendNotification"),NULL,NULL,FALSE);
// Call the event loop
  RunApplicationEventLoop();
CantCreateWindow:
CantSetMenuBar:
CantGetNibRef:
return err;
}
void MyCallBack(CFNotificationCenterRef center,void *observer,CFStringRef name,const void *object,CFDictionaryRef userInfo)
{
printf("CallBack");
}
[/tt]
Est-ce que j'ai mal configuré ma fonction AddObserver ?
Ou alors est-ce que la fonction RunApplicationEventLoop() est inappropriée au contexte et bloque ainsi le Callback, donc dans ce cas que faudrait-il mettre afin d'avoir une simple attente de la notification de retour ?
Si quelqu'un connaissant Carbon a une quelconque idée, je suis preneur de toute info. :why?:
[tt]
void MyCallBack(CFNotificationCenterRef center,void *observer,CFStringRef name,const void *object,CFDictionaryRef userInfo);
int main(int argc, char* argv[])
{
  IBNibRef nibRef;
  WindowRef window;
 Â
  OSStatus err;
  // Create a Nib reference passing the name of the nib file (without the .nib extension)
  // CreateNibReference only searches into the application bundle.
  err = CreateNibReference(CFSTR("main"), &nibRef);
  require_noerr( err, CantGetNibRef );
 Â
  // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
  // object. This name is set in InterfaceBuilder when the nib is created.
  err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar"));
  require_noerr( err, CantSetMenuBar );
 Â
  // Then create a window. "MainWindow" is the name of the window object. This name is set in
  // InterfaceBuilder when the nib is created.
  err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window);
  require_noerr( err, CantCreateWindow );
  // We don't need the nib reference anymore.
  DisposeNibReference(nibRef);
 Â
  // The window was created hidden so show it.
  ShowWindow( window );
CFNotificationCenterAddObserver(CFNotificationCenterGetDistributedCenter(),
   NULL,
   MyCallBack,
   CFSTR("ReceiptNotification"),
   NULL,
  CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(),CFSTR("SendNotification"),NULL,NULL,FALSE);
// Call the event loop
  RunApplicationEventLoop();
CantCreateWindow:
CantSetMenuBar:
CantGetNibRef:
return err;
}
void MyCallBack(CFNotificationCenterRef center,void *observer,CFStringRef name,const void *object,CFDictionaryRef userInfo)
{
printf("CallBack");
}
[/tt]
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le contenu du buffer n'est affiché que lors d'un saut de ligne (\n) ou lors d'un fflush (et peut-être lors d'un \r aussi)
En Cocoa on n'utilise pas la sortie standard tous les jours... Mais si tu faisais un outil en ligne de commande utlisant le Framework Cocoa, je ne vois pas pourquoi ça ne générerait pas le même problème :P Ca ne vient pas de Cocoa ou du C mais de stdout qui est buffurisé :fouf):