2011-01-14 10 views
2

Ich habe gerade begonnen, Apple's Thread-Programmieranleitung zu lesen.
Ich fange einen Thread und habe einen Verweis darauf(iphone) Wie runloop richtig hier einrichten? viele Fragen

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

und der thread sieht aus wie Beispielcode aus dem doc.
Ich werde "exitNow" Variable im Code vom Hauptthread ändern müssen, um diesen Thread zu beenden, aber weiß nicht wie.
myThreadMain Schleife muss schlafen, wenn es keine Arbeit ausführt, aber auch nicht wissen, wie es implementiert wird.
Das Dokument sagt, ich brauche mindestens eine Eingabequelle, wenn der neue Thread nicht sofort stirbt, aber der neue Thread benötigt nur "Exit jetzt Nachricht" und performSelector: onThread: Anruf zu erhalten.
Sollte ich eine Eingabequelle einrichten?

- (void) myThreadMain 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    BOOL exitNow = NO; 
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 

    // Add the exitNow BOOL to the thread dictionary.                                                       
    NSMutableDictionary* threadDict = [[NSThread currentThread] threadDictionary]; 
    [threadDict setValue:[NSNumber numberWithBool:exitNow] forKey:@"ThreadShouldExitNow"]; 

    // Install an input source.                                                            
// [self myInstallCustomInputSource];                                                           

    while (!exitNow) 
    { 
     // Do one chunk of a larger body of work here.                                                    

     // Run the run loop but timeout immediately if the input source isn't waiting to fire.                                             
     [runLoop runUntilDate:[NSDate date]]; 

     // Check to see if an input source handler changed the exitNow value.                                                 
     exitNow = [[threadDict valueForKey:@"ThreadShouldExitNow"] boolValue]; 
    } 

    [pool release]; 
} 

Ich bin von

performSelector:onThread:withObject: 

der Wähler auf diesen Thread einige Arbeitsplätze zur Hand gehen ausführen müssen, wie folgend, definiert werden
aber auch nicht wissen, wie dies zu erreichen, .

- (void) selectorToPerformInThread 
{ 
    for(int i = 0; i < 10; ++i) 
    { 
    do something; 
    **if(received a new "selectorToPerformInThread" call 
     when we are still in this loop) 
      break out and let the new "selectorToPerformInThread" 
      in order to run from the beginning of loop** 
     } 
    } 

Das ist eine Menge von Fragen ist ...
Lassen Sie mich meine Fragen wiederholen.

  1. Wie wird die Variable "exitNow" eingestellt, die in threadDict gespeichert wird?
  2. Wie wird der Thread so eingerichtet, dass er schläft, wenn keine Arbeit ausgeführt wird (wenn der Selektor nicht ausgeführt wird).
  3. Sollte ich eine Eingabequelle einrichten, damit der Thread nicht sofort stirbt?
  4. Wie run loop einrichten, so dass bei jedem Aufruf von "performSelector" der selbe Selektor (wenn er ausgeführt wird) abgebrochen wird und von Anfang an ausgeführt wird?

Vielen Dank im Voraus.

+0

so haben Sie diese herausgefunden? Wenn Sie Ihren Code teilen oder auf einige nützliche Tutorials hinweisen können, wäre das großartig. – abbood

Antwort

0

1/entweder die exitNow Variable durch Verweis übergeben und in den threadDict gesetzt oder das Objekt passiert die Variable enthält und eingestellt obj.exitNow = YES;

2/nur noch sterben, wenn der Faden seine Arbeit beendet hat. Sie benötigen einen neuen Thread, starten Sie einfach eine neue

3/Ich habe nicht Ihre Idee, sorry

4/Ich glaube, Sie ein Singleton obj benötigen, und legen Sie die Variable in diesem Objekt so dass der Thread beenden und dann starten Sie einen neuen Thread und rufen Sie den Selektor

+0

1. sagen Sie, threadDict ist threadsicher? 2. Aufrechterhaltung eines Threads ist eine der Anforderungen 3. eine Antwort gefunden, NSRunLoop * runloop = [NSRunLoop currentRunLoop]; [Runloop-Add-Port: [NSMachPort-Port] forMode: NSDefaultRunLoopMode]; verhindert, dass Thread sofort beendet wird. 4. Auch das Aufrechterhalten eines Threads ist eine Voraussetzung – eugene

Verwandte Themen