[Carbon] CFNotificationCenter Callback

Eddy58Eddy58 Membre
septembre 2005 modifié dans Actualités #1
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]

Réponses

  • Eddy58Eddy58 Membre
    02:30 modifié #2
    J'ai posté ce problème dans MacBidouille, et on m'a suggéré qu'il manquait simplement le \n dans le printf. Aprés essai, il s'avère que c'était bien ça...:)
  • VeillardVeillard Membre
    02:30 modifié #3
    C'est quand-même mieux Cocoa  :fouf):
  • AliGatorAliGator Membre, Modérateur
    02:30 modifié #4
    dans 1130254331:

    C'est quand-même mieux Cocoa  :fouf):
    Ben c'est normal, la sortie standard est buffurisée.
    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):
  • Eddy58Eddy58 Membre
    02:30 modifié #5
    Ouai, en tout cas il fallait le savoir cette histoire de buffer, de plus même le debugger ne s'arrêtait pas au point d'arrêt dans la fonction callback, donc je croyais que mon code était erroné. Mais bon, c'est juste une petite incursion dans Carbon et c'est suffisant, car j'ai vu qu'il fallait aussi implémenter des fonctions callback pour faire fonctionner les propriétés classique de gestion mémoire, release et retain, avec les CFDictionary, CFArray et autres, et ça a pas l'air du gâteau, en plus RTFM ne donne pas grand chose pour ça :P, mais je n'en ai pas besoin après tout. L'utilité de la chose est uniquement d'avoir sous la main un exemple fonctionnel afin de le fournir aux développeurs d'applis Carbon qui désireraient faire communiquer leur soft avec le mien. :)
Connectez-vous ou Inscrivez-vous pour répondre.