2013-07-05 6 views
0

Je suis en train de porter une application sur Mac OS X.Equivalent PostThreadMessage sous Mac OS X

Je dois également effectuer une tâche sur Mac OS X. Un thread A doit publier un message dans la file d'attente des messages d'un autre thread B. Ce message implique également certains messages personnalisés. Sur un message particulier comme EXIT_LOOP, le thread B sort de la boucle de message.

J'ai lancé la boucle de message pour le thread B en utilisant CFRunLoop.

Maintenant, je ne peux pas trouver comment le thread A peut envoyer un message à fil B.

Dans Windows, cela est possible PostThreadMessage. Il n'y a peut-être pas de port direct vers Mac OS X, mais il doit y avoir un moyen de le faire sur Mac OS X.

Veuillez noter que le thread B ne connaît pas le thread A, mais le thread A connaît le thread B.

Windows code:

MessageLoop() { 
    MSG message; 
    BOOL ret; 
    while(ret = GetMessage(&message, NULL, 0, 0) != 0) { 
     if(ret == -1) 
      break; 

     if(UseMessage(message) = EXIT) 
      break; 

    } 

} 

int UseMessage (MSG Message) 
{ 
    switch(Message) { 

    //Process various messages. 

    case I_AM_COMPLETE: 
     return EXIT; 

    } 
} 


//Thread A: 
MessageLoop(); 
//Cleanup 

//Thread B: 
PostThreadMessage(threadidofA, I_AM_COMPLETE, 0, 0); 

Je crois que ce code peut donner plus de clarté. Je veux des fonctionnalités équivalentes sur Mac OS X.

+0

Qu'est-ce qui ne va pas avec n'importe quelle ancienne classe de collection et certains verrous de threads? – trojanfoe

+0

Je ne suis pas familier avec Mac OS X. Je ne sais pas comment y parvenir sur Mac OS X. Je veux juste des fonctionnalités équivalentes sur Mac OS X. Si cela est possible en utilisant le verrouillage de threads, veuillez poster un exemple. – doptimusprime

+0

Pour le rendre plus clair, j'ai ajouté un exemple de code. – doptimusprime

Répondre

1

En règle générale, vous devriez adopter une approche différente pour votre effort de portage. N'essayez pas de "translittérer" les stratégies de codage Win32 pour celles de Mac. Réorganiser votre conception pour les techniques de codage Mac à partir de la base.

Quoi qu'il en soit, il existe différentes façons de réaliser quelque chose de similaire. Probablement le plus simple exige que le fil B utilise NSRunLoop plutôt que CFRunLoop. Ensuite, le thread A peut utiliser -[NSObject performSelector:onThread:withObject:waitUntilDone:] pour exécuter une méthode sur le thread B.

+0

Je ne maintiens pas l'objet NSThread. Thread A possède uniquement l'identifiant de Thread B. Veuillez fournir une solution dans CFRunLoop ou en utilisant des threads Posix (tels que des verrous). Même si cela nécessite de mettre en place une source de boucle d'exécution personnalisée, je peux le faire. – doptimusprime

+1

Il n'y a presque rien d'intéressant que vous pouvez faire avec juste l'ID de fil. Pourquoi insistez-vous sur le fait que vous ne pouvez avoir qu'un ID de threads lorsque cela ne répond pas aux besoins de votre programme? Toute solution utilisant des verrous ou une source de boucle d'exécution personnalisée nécessite toujours que vous conserviez une référence à une structure de données partagée. Une fois que vous avez accepté cette exigence, votre structure de données partagée peut également être un pointeur 'NSThread'. La méthode que j'ai suggéré est certainement implémentée sous le capot comme une source de boucle d'exécution ou une sorte de minuterie. Pourquoi ré-implémenter ce qui est déjà fourni? –