2012-05-03 12 views
5

Utworzono wątek w kodzie xxi nadałem nazwę funkcji, która ma zostać wywołana z tego wątku. ale moim problemem jest to, że nazwa funkcji, która daje się nazwać nie jest nazywany (poznał podczas umieścić punkt przerwania w tej funkcji)Wywołanie funkcji za pomocą wątku w kodzie xcode

Kod:

NSThread* myThread; 
[myThread start]; 
[self performSelector:@selector(func1:) onThread:myThread withObject:nil waitUntilDone:false] 

i później próbowałem ten jeden też :

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(func1:)object:nil]; 
[myThread start]; 

powyżej func1 to nazwa funkcji, która ma zostać wywołana.

więc może ktoś mi powiedzieć jak stworzyć nić i wywołać func1 stamtąd ....

Odpowiedz

16

W pierwszym przykładzie kodu nie wygląda na to, że faktycznie tworzysz nowy wątek. Tworzysz pustą zmienną myThread, a następnie wywołujesz na niej start, ale spowoduje to wysłanie start do nil. Pusta zmienna wątku jest następnie przesyłana do metody performSelector:onThread:withObject:waitUntilDone:, która prawdopodobnie nic nie da.

Będziesz musiał prawidłowo utworzyć wątek, zanim będziesz mógł go uruchomić, używając performSelector:onThread:withObject:waitUntilDone:.

Alternatywnie byłoby znacznie łatwiej, zakładając, że nie obchodzi cię, na którym tle działa metoda, aby po prostu użyć performSelectorInBackground:withObject:. Na przykład:

[self performSelectorInBackground:@selector(func1:) withObject:nil]; 
+0

dziękuję za odpowiedź, ale czasami zajmuje ona główny wątek, którego nie chcę ..... –

+0

Chciałbym poznać wszelkie informacje na temat 'performSelectorInBackground: withObject:' używając głównego wątku . W dokumentacji Apple jest napisane: "Ta metoda tworzy nowy wątek w aplikacji, wprowadzając aplikację w tryb wielowątkowy, jeśli jeszcze jej nie było." Jeśli masz informacje, które pokazują, że czasami używa głównego wątku, który byłby zainteresowany, aby go zobaczyć. – mttrb

+0

Niestety, akcja nie była wykonywana w głównym wątku, ponieważ po func1 znajduje się ":", nie było uruchomione i myślałem, że bierze główny wątek.Ale teraz po usunięciu ":" (zgodnie z inną odpowiedzią na to pytanie) działa dobrze .. podziękowania za odpowiedź ...... –

3

Spróbuj wykonać następujące czynności, jeśli to działa:

[NSThread detachNewThreadSelector:@selector(func1) toTarget:self withObject:nil]; 

Ponieważ nie przechodzą żadnego obiektu do twojego "func1" (aka: twoja metoda nie ma parametrów) nie musisz wstawiać ":" po nazwie.

0

Jeśli twój func1 przyjmuje jeden argument. Wtedy zdecydowanie musi działać z drugim podejściem, którego użyłeś. Może być twój fuc1 nie ma formalnej argumentacji i wciąż dzwonisz w selektorze takim jak ten @ selektor (fuc1 :) i przekazujący obiekt jako zero. więc może być z tego powodu nie działa. To może być jeden powód. po prostu spróbuj, jeśli nie.

+0

Ilekroć korzystasz z dowolnego obiektu dowolnej klasy, nigdy nie zapomnij przydzielić pamięci, tak jak w swoim pierwszym podejściu. – iDevAmit

Powiązane problemy