NSThread / NSAutoreleasePool

  • NSThread / NSAutoreleasePool

    hi zusammen

    ich versuche den thread welcher die internet verbindung in meiner app alle 5 sek. testet in einen eigenen thread zu packen.

    mein code ist der folgende:

    Quellcode

    1. - (void)startInternetConnectionCheckThread: (id)sender
    2. {
    3. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    4. [NSThread detachNewThreadSelector: @selector(checkInternetConnection:) toTarget:self withObject:self];
    5. [pool release];
    6. [self performSelector:@selector(startInternetConnectionCheckThread:) withObject:nil afterDelay:5];
    7. }
    8. - (void)checkInternetConnection: (id)sender
    9. {
    10. NSLog(@"%@", NSStringFromSelector(_cmd));
    11. // return;
    12. Boolean success;
    13. SCNetworkConnectionFlags status;
    14. success = SCNetworkCheckReachabilityByName("www.apple.com",
    15. &status);
    16. connectedToInternet = success && (status & kSCNetworkFlagsReachable) && !(status &
    17. kSCNetworkFlagsConnectionRequired);
    18. if (!connectedToInternet)
    19. {
    20. success = SCNetworkCheckReachabilityByName("www.w3.org",
    21. &status);
    22. connectedToInternet = success && (status & kSCNetworkFlagsReachable) &&
    23. !(status & kSCNetworkFlagsConnectionRequired);
    24. }
    25. // status = nil;
    26. // success = nil;
    27. [self willChangeValueForKey:@"statusIconForInternetConnection"];
    28. [self didChangeValueForKey:@"statusIconForInternetConnection"];
    29. [self willChangeValueForKey:@"statusMessageForInternetConnection"];
    30. [self didChangeValueForKey:@"statusMessageForInternetConnection"];
    31. }
    Alles anzeigen


    irgendwie hat er meine willChangeValueForKey / didChangeValueForKey nicht so gerne denn folgendes gibt die console aus:

    Quellcode

    1. 2006-12-15 22:17:48.584 Luscious SMS[425] *** _NSAutoreleaseNoPool(): Object 0xa25de2f0 of class NSCFString autoreleased with no pool in place - just leaking
    2. 2006-12-15 22:17:48.584 Luscious SMS[425] *** _NSAutoreleaseNoPool(): Object 0xc633c90 of class NSCFString autoreleased with no pool in place - just leaking
    3. 2006-12-15 22:17:48.584 Luscious SMS[425] *** _NSAutoreleaseNoPool(): Object 0x4a1880 of class NSCFString autoreleased with no pool in place - just leaking
    4. 2006-12-15 22:17:53.483 Luscious SMS[425] *** _NSAutoreleaseNoPool(): Object 0xc64f590 of class NSCFString autoreleased with no pool in place - just leaking



    aber selbst wenn ich diese auskommentiere bringt er noch das hier:


    Quellcode

    1. 2006-12-15 22:18:49.680 Luscious SMS[449] *** _NSAutoreleaseNoPool(): Object 0xc3b1110 of class NSCFString autoreleased with no pool in place - just leaking


    ich habe noch nicht allzuviel erfahrung mit threads. ich hab mal das was ich im internet gefunden habe oben in meine methoden gepackt (NSAutoreleasePool).

    hat mir jemand ein tip?

    viele grüsse philippe
  • zunächst solltest Du nicht apple.com pingen, das kann ganz übel enden, wenn die app weit verbreitet wird...

    dann sollte der Autoreleasepool in der Methode checkInternetConnection angelegt und wieder geschlossen werden, denke ich. Dann sollte es klappen. (in der Methode, die den Thread startet ist das überflüssig)
  • Ich kenn mich da leider nicht so aus. Gibt es keine bessere Möglichkeit, die Verbindung zum Internet zu überprüfen als ein Ping? Keine Ahnung, wie viel Last das auf den Servern erzeugt (landet der Ping überhaupt bei den Servern?), aber wenn nur 1000 Leute Dein Programm gleichzeitig verwenden, sendet es ja im Durchschnitt schon 200 Pings pro Sekunde an apple.com.
    Aber vielleicht mache ich da auch unnötig Panik und der Aufruf von SCNetworkCheckReachabilityByName bewirkt überhaupt keine Last auf dem Zielrechner...
  • Also tausend pings werden Apple noch nicht in die Knie zwingen, aber trotzdem ist es wohl keine befriedigende Lösung einen fremden Server mit theoretisch tausenden von Pings alle 5 Minuten zu belästigen.

    Darüberhinaus könnte Apple oder wer auch immer auf die Idee kommen ICMP Pakete an der Firewall zu verwerfen und dann bekommt deine App Probleme (Vor allem wenn sie merken das irgendwelche Verrückten den Server alle 5 Min anpingen werden sie die DOS Bremse ziehen ;) ).

    Ich würde erstmal garnicht checken ob der Rechner mit dem Internet verbunden ist. Einfach das machen was du vorhast. Wenn das schief geht, kannst du immernoch weiterchecken warum du keine Verbindung bekommst.

    nur meine Meinung
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Ich gebe es zu, es nicht ausprobiert zu haben ob es das ist was Du suchst/suchen könntest, aber kSCPropNetLinkActive hört sich -- finde ich -- vielversprechend an.
    Vielleicht könntest Du damit vorher testen, ob zumindest _theoretisch_ eine Netzverbindung besteht und dann gegebenenfalls pingen... nur so 'ne Idee.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • RE: NSThread / NSAutoreleasePool

    Ich halts für keine gute Idee alle paar Sekunden zu testen. Warum?

    Du testest einmal beim Start den Zustand des Netzwerks und merkst ihn dir. Dann registrierst du dich bei der System Configuration für Netzwerkänderungen. Dann kannst du deine Abfragen machen wenn der Rechner online geht. (Abfrage auf neue Version etc.)

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.