methode anhalten

  • Quellcode

    1. -(void)sendSqlStats
    2. {
    3. // sql abfragen hier abschicken
    4. [NSThread detachNewThreadSelector:@selector(checkArray:) toTarget:self withObject:nil];
    5. }


    Quellcode

    1. -(void)checkArray:(id)arg
    2. {
    3. while(true)
    4. {
    5. // auf ergebnis hier prüfen
    6. // bei erfüllung die Schleife abbrechen und weitere methode ausführen
    7. [NSThread sleepUntilDate:zeitangabe];
    8. ...
    9. }
    10. }
    Alles anzeigen


    ich würd so umsetzen!
    Aus macfreakz wurde Apfelbeisser …
  • Wenn du warten musst, dann musst warten. Was sollen daran Threads ändern?

    Es ist übrigens etwas komisch, dass du so genau die Anfrage kennen musst. Was bekommst du denn als Ergebnis-Beschreibung? Reicht dir das nicht? Wenn du das Ergebnis intern übernehmen muss, dann mache das einfach mit den entsprechenden Settern und KVO übernimmt den Rest. Du trittst damit ja eine ganze Maschinerie los.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ja, das will er aber ja gerade nicht, weil im die while-Schleife anödet, was ich verstehen kann.

    Aber wenn er eine Notification bekommt, dann verstehe ich das ganze Problem nicht mehr. Wenn ich ein Ereignis bekomme, muss ich nicht pollen ...
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Das ist aber kein Problem, welches sich mit Threading oder Semaphoren lösen lässt. Du musst sehen, dass du Anfragen und Antworten matchen kannst.

    Was schickt dir denn die Notification an Parametern? Hast du Tags oder Query-IDs?


    es ist eine notification von nsfilehandle und die bekommt lediglich ein nsdata geschickt mit dem ergebnis geschickt bekommt. (wir sind hier auf der clientseite nicht auf dem server)

    ich kann dir das auch gern am telefon beschreiben, weil es wirklich etwas kompliziert ist.....
  • es ist eine notification von nsfilehandle und die bekommt lediglich ein nsdata geschickt mit dem ergebnis geschickt bekommt. (wir sind hier auf der clientseite nicht auf dem server)

    Ah, verstehe, hattest du auch schon gesagt. Sorry!

    Kennst du den File-Handle denn schon beim Absenden der Anfrage? Dann löst sich das Problem recht einfach.

    ich kann dir das auch gern am telefon beschreiben, weil es wirklich etwas kompliziert ist.....

    Jepp, scheint mir auch so.

    0221/8606060 Rechtsanwalt Amin Negm-Awad
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Ja, das will er aber ja gerade nicht, weil im die while-Schleife anödet, was ich verstehen kann.


    mich ödet das ja nicht an, ganz im gegenteil, ich würde das gern mit einer whileschleife machen.
    aber die while schleife legt das ganze app lahm. wenn sich das app in der while schleife befindet, dann wird die notification nicht ausgelöst....
  • Nein, sie legt den Rechner nur insoweit lahm, als dass die Schleife Prozessorleistung verbraucht. Deine Haupt-App läuft normal weiter -- natürlich abzüglich der last des Threads.

    Aber ich finde es schräg zu pollen, wenn du ein Ereignis bekommst. Event-driven ist ja eleganter und performanter. Da erübrigt sich eigentlich das Pollen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ah, ganz anders gemeint. Ich habe gerade mal mit ihm gesprochen. Die Lage stellt sich wie folgt dar:

    Er schickt eine Anfrage an den Server. Hierauf bekommt er eine Antowrt. Anfrage und Antwort laufen über einen NSFileHandle, dem ein Comm-Kanal zugerondet ist.

    Er will, dass seine App steht, bis die Anfrage bearbeitet ist. Vorher ist ein weiteres arbeiten nicht sinnvoll.

    Damit dürften Threads genau das Verkehrte sein. Auch Notificatins, die ja für eine asynchrone Abarbeitung gedacht sind,sind genau falsch.

    Er probiert jetzt einfach einen readDataToEndOfFile auf dem Kanal. Das klingt nämlich so, als ob die Lese-Reoutinen blocken würden. So lange hängt natürlich seine App -- was er ja gerade will.

    Noch Ideen oder Verbesserungsvorschläge?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • So, habe mir die Programme mal angeschaut.

    Original von Tom9811
    Nein, sie legt den Rechner nur insoweit lahm, als dass die Schleife Prozessorleistung verbraucht.

    Nicht ganz. Im client wird die Action sendSQL: vom RunLoop getriggert, also dem Main Thread. Wenn dieser Thread jetzt auf das Ergebnis des Servers wartet ist natürlich die komplette Application "eingefroren", da der RunLoop beschäftigt ist.

    In der Methode sendSQL: solltest Du einen neuen Thread starten, welcher dann parallel zum RunLoop läuft und so die Application nicht "einfrieren" lässt.

    Wärend ich hier schreibe lese ich gerade, dass die Application wohl doch "einfrieren" soll, also überhaupt nicht mehr bedienbar sein soll, solange eine Verarbeitung läuft, richtig?
  • Ah, noch ein Problem und gleich die Lösung:

    Weil readData... ja synchron ist, wartet deine App nicht nur, bis das EOF kommt, sondern ewig, wenn kein EOF kommt. Das wäre natürlich nicht wünschenswert. Du musst also die Notbremse ziehen können und das asynchron unterbrechen können. Hier eine Möglichkeit:

    Du startest die Abfrage dann doch in einem eigenem Thread. Du machst dir hierzu ein kleines Objekt, welches als Init-Parameter den File-Handle bekommt und eine Methode -ready hat. Im Hauptprogramm kannst du dann eine while-Schleife machen, die dieses ready ständig abfragt. Wenn du nach einer Zeit t immer noch in der Schleife hängst, dann brichst du sie ab. Also in etwa

    Quellcode

    1. //Hauptthread
    2. ...
    3. Thread erzeugen
    4. Mit der Abfrage beauftragen
    5. while( ![meinAbfrageManager ready] ) {
    6. if( "time elapse" > 10 Sekunden )
    7. break;
    8. if( [meinAbfrageManager ready] )
    9. // tue, was du tun musst
    10. else
    11. Thread töten
    12. Fehlermeldung "Server schläft, ist überlastet, jedenfalls keine Antwort"
    13. ...
    Alles anzeigen

    So hast du eine synchrone Abfrage, die du asynchron stoppen kannst.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • So, habe jetzt mal versucht im Client in einem eigenen Thread die Nachricht an den Server zu senden. Leider wird die Notification von NSFileHandle in den RunLoop gepostest, welcher jedoch schläft. Dies führt dann zu einem signal 5 (SIGTRAP). X(

    Kannst Du mal versuchen die Kommunikation auf Distributed Objects mit NSConnection umzustellen?

    Dann hättest Du laut Docu die Möglichkeit den RunLoop z.B. mit runMode:beforeDate: in den Mode NSConnectionReplyMode zu schalten. Dieser sollte dann auf ein Ergebnis von NSConnection warten.

    Ist doch genau dass, was Du suchst, oder?
  • Original von MCDan
    So, habe jetzt mal versucht im Client in einem eigenen Thread die Nachricht an den Server zu senden. Leider wird die Notification von NSFileHandle in den RunLoop gepostest, welcher jedoch schläft. Dies führt dann zu einem signal 5 (SIGTRAP). X(

    Kannst Du mal versuchen die Kommunikation auf Distributed Objects mit NSConnection umzustellen?

    Dann hättest Du laut Docu die Möglichkeit den RunLoop z.B. mit runMode:beforeDate: in den Mode NSConnectionReplyMode zu schalten. Dieser sollte dann auf ein Ergebnis von NSConnection warten.

    Ist doch genau dass, was Du suchst, oder?



    *heul* alles nochmal machen *schnief*
    aber man kann auch nur dazulernen.
    gibts da ne vernünftige docu zu oder vllt sogar beispielcode? funktioniert das auch mit bonjour zusammen?
  • Klar wird ide Notification im Main-Thread gepostet. Ein Thread hat standardmäßig keine eigene Runloop.

    Aber ich meine weterhin, dass er das nicht braucht. Notifications sind für asynchrone Beabreitung erforderlich. Er will synchron abarbeiten.

    KLappt denn das readData... bzw. availableData nicht?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Klar wird ide Notification im Main-Thread gepostet. Ein Thread hat standardmäßig keine eigene Runloop.

    Aber ich meine weterhin, dass er das nicht braucht. Notifications sind für asynchrone Beabreitung erforderlich. Er will synchron abarbeiten.

    KLappt denn das readData... bzw. availableData nicht?


    nein leider klappt es nicht :(
    availableData bringt nicht den ganzen stream zurück
    und readDataToEndOfFile bleibt hängen und friert die app wie in einer while schleife ein
  • Scheiße!

    Bei availableData musst du natürlich eine Schleife machen. Du bekommst ja immer nur Häppchen.

    Quellcode

    1. NSData* häppchen;
    2. NSMutableData* data = [NSMutableData data];
    3. while( !(häppchen = [fileHandle availableData]) && ([häppchen length] > 0) ) {
    4. [data appendData:häppchen];
    5. }
    6. // done
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?