6
votes

Une fonction C peut-elle être utilisée comme sélecteur en cacao?

Je veux démarrer un nouveau fil à l'aide d'une fonction C, pas une méthode d'objectif-c. J'ai essayé xxx

où j'ai xxx

et data est un vide * , mais j'ai un crash d'exécution dans objc_msgsend , appelé de xxx

Que puis-je faire à la place? Est-ce même possible?


0 commentaires

5 Réponses :


3
votes

Créer une classe Objective-C avec une méthode qui appelle simplement cette fonction. Prenez le sélecteur de cette méthode et transmettez-le à Nsthread API.


3 commentaires

Ok, oui, je veux dire, sans faire ça. En d'autres termes, je veux savoir s'il manque une syntaxe


Je ne pense pas qu'il y ait une simple façon syntaxique de le faire. Un sélecteur est utilisé pour envoyer un message à un objet. L'envoi d'un message n'est pas identique à simplement appeler une fonction. Les mécanismes sous-jacents sont un peu différents.


J'espérais que cela enveloppait la fonction C automatiquement si elle devait.



3
votes

Eh bien, je ne sais pas si c'est possible, mais gardez à l'esprit que chaque méthode d'objectif-c a deux arguments implicites / cachés, auto et _cmd . Un IMP est généralement typedef d tel que ceci: xxx

Si vous souhaitez que les méthodes et les sélecteurs de jerry-rigortent, vous devez avoir une méthode qui ressemble à celle-là: xxx

mais même après cela, vous devez enregistrer un nom de sélecteur avec l'exécution, puis vous devez associer ce sélecteur avec la méthode, mais Cela se fait de manière classée par classe (c.-à-d. Les classes peuvent avoir différentes implémentations du même nom de sélecteur), de sorte que vous avez au moins besoin d'avoir une classe factice.

C'est beaucoup, beaucoup plus simple juste Pour créer une classe factice et une instance factice de cette classe que d'appeler les différentes API d'exécution juste pour obtenir nsthread pour appeler une seule fonction C.


0 commentaires

10
votes

Rouler votre propre: XXX PRE>

NOTE STROND>: J'ai écrit le code ci-dessus et ici en le place dans le domaine public. (Parfois, les avocats comme ce genre de choses), il est également complètement non testé! em> p>

Vous pouvez toujours supprimer le nsaToreleeePool code> BITS Si vous pouvez vous garantir que la fonction d'entrée de fil crée également une ... mais elle est inoffensif, n'a pas de pénalité de vitesse quoi-même et fait appel à des fonctions arbitraires qui sont beaucoup plus simples. Je dirais juste le garder là-bas. P>

Et vous pouvez l'utiliser comme: p> xxx pré>

lorsque exécution: p>

2009-08-30 22:21:12.529 test[64146:1303] bgThreadFunction STARTING!! Data: 0xdeadbeef
2009-08-30 22:21:12.529 test[64146:2903] bgThreadFunction STARTING!! Data: 0xcafebabe


2 commentaires

Il n'y a pas beaucoup de choses à faire tout cela et à rouler sa propre implémentation, tandis que nous pouvons vous fairez, DISPATHC_ASYNC_F () . Il est probablement préférable de laisser la mise en œuvre du filetage aux ingénieurs d'Apple. Ils savent peut-être un peu mieux ce qui se passe dans leur système.


Salut essayé votre code, à l'intumethod et c'est ce que j'ai obtenu - [Nsthread initwithfunction: Data:]: Sélecteur non reconnu envoyé à l'instance 0x60000007B7C0



1
votes

Si vous n'avez pas besoin nsthread , vous pouvez également démarrer un thread avec Interface Direct Posix .


0 commentaires

0
votes

Je veux démarrer un nouveau fil à l'aide d'une fonction C, pas une méthode de l'objectif-c

Alors pourquoi n'utilisez-vous pas simplement:

  1. threads POSIX,
  2. GCD?

    DISPATCH_ASYNC_F () (homme) est adapté à exactement à cet effet.


0 commentaires