methode anhalten

  • methode anhalten

    hallo leute,

    wie bekomme ich es hin eine methode die grade abgearbeitet wird zu pausieren bis eine
    instanzvariable von einem anderen thread gefüllt wurde. sobald die variable einen wert
    enthält soll die methode weiterlaufen.
    das einzige was mir einfällt ist eine whileschleife, aber ich denke das ist nicht die einzige
    möglichkeit.

    sascha
  • RE: methode anhalten

    Original von macuser
    hallo leute,

    wie bekomme ich es hin eine methode die grade abgearbeitet wird zu pausieren bis eine
    instanzvariable von einem anderen thread gefüllt wurde. sobald die variable einen wert
    enthält soll die methode weiterlaufen.
    das einzige was mir einfällt ist eine whileschleife, aber ich denke das ist nicht die einzige
    möglichkeit.

    sascha


    hmm in 2 methoden zerlegen ? und die 2.methode dann mit der neuen variablen aus dem anderen thread fuettern.

    war so spontan meine idee....

    gruesse,
    jens
    malloc: *** vm_allocate(size=1665622016) failed (error code=3)
  • RE: methode anhalten

    Macht das Gegenteil von dem, was er will.

    @macuser
    Du bist doch der mit der Warteschlange, oder?

    Ich würde von der Warteschlange den Thread starten und bei Beendigung ihn einfach wieder vernichten. Bis halt das nächste Ereignis kommt. Ist aber jatzt aus dem hohlen Bauch heraus.
    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 der bin ich :)

    ich steh grad vor einem ziemlichen problem.
    kurze einleitung:
    ich habe einen server der auf eine sqlite db zugreift.
    die clients schicken (übers netzwerk) sqlstatements zum server.
    diese landen da in einer warteschlange. wenn sie abgearbeitet werden, schickt der server
    das ergebnis an den client zurück. das kommt da in einer notification an.

    das problem ist:
    ich muss auf der clientseite die methode die das statement zum server schickt solange pausieren bis
    vom server das ergebnis kommt, damit ich dieses dann weiterverarbeiten kann.
    ich hab das jetzt mit einem while probiert, aber das legt das ganze programm lahm sodas kein ergebnis vom server empfangen werden kann.

    ich bin ziemlich ratlos....
  • Musst du nicht sein.

    Zwei Möglichkeiten:
    - Mit dem Abschicken deiner Anfrage startest du einen Antwort-Warte-Thread. Der wiederum, nur aus einer while-Schleife bestehend, schickt eine Notification, die du im Hauptprogram zumAnlass nimmst, irgendwas abzuholen oder upzudaten oder so.

    So bleibt dein Hauptthread mit der Eventloop nicht hängen. Allerdings hast du performance-Verlust.

    - Du bekommst ja sicher irgendwie das Ergebnis mitgeteilt. Geht das denn nicht event-driven? Wie sieht das in der von dir verwendeten Lib aus?
    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"?
  • das grosse problem ist, das ich die daten nicht selbst abhole sondern
    dieser über eine nsfilehandle notification kommen. und genau da liegt der hase im pfeffer.
    ich haben die letzten stunden das halbe internet durchsucht und keine lösung gefunden.
    ich habe nslock probiert aber er bleibt einfach nicht stehen. mit einer whileschleife bleibt
    die ganze app stehen.
    gerade hab ich

    Quellcode

    1. sem = sem_open("warten",O_CREAT);
    2. sem_wait(sem);
    probiert. aber auch da kein erfolg. er bleibt verdammtnochmal einfach nicht stehen :(

    ich weiss nicht mehr was ich machen soll
  • Original von macuser

    Quellcode

    1. sem = sem_open("warten",O_CREAT);
    2. sem_wait(sem);
    probiert. aber auch da kein erfolg. er bleibt verdammtnochmal einfach nicht stehen :(


    Mal aus "man sem_open" zitiert:

    If O_CREATE if specified, sem_open() requires an additional two argu-
    ments. mode specifies the permissions for the semaphore as described in
    chmod(2) and modified by the process' umask value (see umask(2)). The
    semaphore is created with an initial value, which must be less than or
    equal to SEM_VALUE_MAX.


    und jetzt noch aus "man sem_wait":
    When calling sem_wait(), if
    the semaphore's value is zero, the calling thread will block until the
    lock is aquired or until the call is interrupted by a signal


    Alle sind sich - glaub ich - einig, dass die Anfrage in einem eigenen Thread
    erfolgen muss, damit das Hauptprogramm nicht blockiert.
    Wenn man dafür sorgt, dass die Semaphore mit "0" initialisiert
    wird, dann dürfte das sem_wait diesen Anfragethread auch blockieren.
    Der Notification-Handler könnte diesen dann mittels "sem_post" befreien.
    In welchem Thread wird so ein Handler denn ausgeführt, ich habe von Notifications
    keine Ahnung :asian:

    Gruss!
  • Jetzt stehe ich wohl auf dem Schlauch. Wenn du doch eine Notification bekommst, dann ist das Problem doch gelöst, oder?

    Du schickst die Abfrage ab und machst in deinem Programm ganz einfach weiter. Irgendwann kommt die Notification und du aktualisierst entsprechend deine Views.

    Bin ich zu blöde, das Problem zu sehen?
    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"?
  • Statt per NSTimer alle 1 Sekunde eine Methode abzufeuern, würde ich NSThread mit seiner Methode bevorzugen:

    Quellcode

    1. + (void)sleepUntilDate:(NSDate *)aDate;


    So kann jede 1 Sekunde geprüft werden, ob die Arrays mit Objekten gefüllt ist oder nicht.

    @tom: Welchen KeyPath muss man überwachen, damit ich die Grössenänderung eines Arrays mitbekommen kann? Aber ich verstehe das Problem auch nicht, wenn man die Hinzufügen Funktionen "privatisiert" und stattdessen nur das Setzen vom Array Objekt ermöglicht wird, wo man nur 1-2 die Notifications manuell abfeuern muss.

    Quellcode

    1. -(void)setArray:(NSArray *)newArray
    2. {
    3. [newArray retain];
    4. [meinArray release];
    5. meinArray = newArray;
    6. // hier soll eigene Notification abgefeuert werden
    7. }


    So kann macuser´s Problem gelöst werden oder?
    Aus macfreakz wurde Apfelbeisser …
  • Original von Tom9811
    Jetzt stehe ich wohl auf dem Schlauch. Wenn du doch eine Notification bekommst, dann ist das Problem doch gelöst, oder?

    Du schickst die Abfrage ab und machst in deinem Programm ganz einfach weiter. Irgendwann kommt die Notification und du aktualisierst entsprechend deine Views.

    Bin ich zu blöde, das Problem zu sehen?


    es geht eben nicht nur einfach darum views zu aktualisieren. die daten müssen weiterverarbeitet werden.

    ich wünschte ich könnte die daten vom server manuel holen und sie würden nicht automatisch kommen.

    ich hab das mal auf meinen server gestellt schaut es euch mal an. vllt fällt doch noch jemandem was ein.
    download
  • es geht eben nicht nur einfach darum views zu aktualisieren. die daten müssen weiterverarbeitet werden.

    Und? Dann machst du das eben in der Notification! Also ich sehe wirklich nicht mehr das Problem. Du bekommst doch ein Ereignis (aka NotificatioN) gesendet. Dort machst du das, was du zu tun hast.
    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 macfreakz
    Stimmt das Grundprinzip so?

    Client erfasst einen Auftrag, schickt es an den Server und der Server leitet den Auftrag an z.B. alle Clients weiter?


    nein. aber das hab ich weiter oben schon beschrieben.
    am server hängt eine datenbank (sqlite)
    die clients schicken sqlstatements zum server.
    der server verarbeitet diese und schickt das ergebnis an den gleichen client zurück
    der client verarbeitet das ergebnis dann weiter (aber immer anders, da es verschiedene "rufende" methoden gibt) darum MUSS ich auf der ergebnis vom server warten!!!
  • Original von Tom9811
    es geht eben nicht nur einfach darum views zu aktualisieren. die daten müssen weiterverarbeitet werden.

    Und? Dann machst du das eben in der Notification! Also ich sehe wirklich nicht mehr das Problem. Du bekommst doch ein Ereignis (aka NotificatioN) gesendet. Dort machst du das, was du zu tun hast.


    es ist aber nicht immer das gleiche was ich zu tun hab. viele methoden in meinem programm schicken sqlstatements zum server und das ergebnis wird von jeder rufenden methode anders verarbeitet
  • @tom: Welchen KeyPath muss man überwachen, damit ich die Grössenänderung eines Arrays mitbekommen kann? Aber ich verstehe das Problem auch nicht, wenn man die Hinzufügen Funktionen "privatisiert" und stattdessen nur das Setzen vom Array Objekt ermöglicht wird, wo man nur 1-2 die Notifications manuell abfeuern muss.

    [Und der folgende Code]
    Jo, so mache ich das inzwischen stets:

    Meine Setter kennen nur Immutables. Eine Ädnerung des Arrays kann daher nur über den entsprechenden Setter erfolgen, der natürlich dann einen entsprechenden Key hat. Jedes Hinzufügen oder Entfernen eines Elementes ist eine Änderung des Arrays, lässt sich also observieren. Eine Änderung der referenzierten Objekte ist per KVO durchzuführen. Hierzu mein Artikel zu KVO. Dies sollte allerdings nicht das Model machen, wenn es nicht erforderlich ist, sondern der entsprechende View, der die einzelnen Properties anziegt. Das Model interessiert das ja häufig gar nicht.

    Man muss dann auch keine wirklich Notification schicken. Wenn sich das Model an das neue Array anpassen muss, was wohl der Fall ist, so kann man das einfach im Setter machen. Hierbei benutzt man ja wieder Setter für andere Properties, die vom View observiert werden. Also, ein Beispiel:

    Man hat ein Array das Artikel einer Bestellung beinhaltet. Wird ein Artikel hinzugefügt, so wird dies durch ein neues Array gemacht:

    Quellcode

    1. // Methode zum hinzufügen, etwa im Model
    2. -addItem:(Item*)item {
    3. NSMutableArray* newItems = [[[self items] mutableCopy] autorelease];
    4. [newItems addObject: item];
    5. [self setItems:newItems];
    6. }

    Nein, Performance-Ängste muss man da nicht haben.

    So, jetzt nehmen wir an, es gibt eine Anzahl von Artikeln in der Bestellung. Ich mache mir hier meist einen eigenen Key anstelle des @count-Keys. Ich mag den nicht. Ist ein persönliches Problem von mir, kann man sicher anders sehen. Hier eignet es sich aber gut zur Verdeutlichung, weshalb ich das mal mache. Man kann ja etwa auch daran denken, dass der Count bei zusammengesetzten Artikeln nicht der Array-Größe entspricht. Einfach um mal eine Vorstellung zu haben.

    Bei einem neuen Array muss diese Anzahl neu berechnet werden. Also

    Quellcode

    1. -setItems:(NSArray*)items {
    2. // Der ganz normale Wahnsinn
    3. ...
    4. [self setCount:[items count]];
    5. }

    Alternativ kann man natürlich wie du sagst, einfach will-/didChange-Notifications für den Schlüssel count schicken und sich den Setter für count sparen. Noch eleganter ist es wohl, wenn man gleich sagt, dass jede Änderung des Schlüssels Items auch den Schlüssel count ändert. Die Methode heißt irgendwie dependingKey willTriggerKey oder so.

    Also inzwischen verstehe ich sein Problem gar nicht mehr.
    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"?
  • 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 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"?