Results 1 to 7 of 7

Thread: Methode aanroepen in main thread vanuit worker thread

  1. #1

    Methode aanroepen in main thread vanuit worker thread

    Hallo hallo,

    Is het aanroepen van een methode in de main thread vanuit een worker thread per definitie unsafe of hangt dit af van wat er in die methode staat?

    Ik heb in diverse thread klasses gedeeltelijk dezelfde functionaliteit nodig, waarbij een resource moet worden gebruikt uit de main thread. Het zou makkelijk zijn als ik deze methode op de main thread kan zetten, zodat ik deze vanuit alle worker threads kan gebruiken. Ik heb alleen mijn twijfels of dit wel kan?

    Bij voorbaat dank!

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    9,750
    Nee, dit is niet per definitie unsafe. Zolang alles maar bestaat (je roept van uit de thread geen form aan via een reference die b.v. tijdens shutdown niet meer bestaat) EN je doet geen onveilige dingen in de methode (geen GUI of andere synchrone frameworks, leest alleen variabelen, of schrijft alleen met protectie (zoals een critical section of ophogen met increment/decrement* methodes) dan gaat het goed.

    Als je hem uit verschillende methodes aanroept, moet ie ook nog eens reentrant zijn (de methode kan tegelijkertijd uit twee threads worden aangeroepen)

    Kan je wat laten zien/vertellen over de inhoud van de methode?

  3. #3
    Het zal er ongeveer zo uit komen te zien:

    Code:
    function TForm1.GetUserInfo(const AToken: string): TUserInfo; // Record
    begin
      MT.Lock;
      try
        // Opzoeken record op basis van AToken
        // ....
        Result.ID := MT.FieldByName('ID').AsInteger;
        Result.Language := MT.FieldByName('LANGUAGE').AsString;
      finally
        MT.Lock
      end;
    end;

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,294
    MT.Lock in de finally (moet dat niet UNlock zijn)?
    TMemoryLeak.Create(Nil);

  5. #5
    Ik hou ervan als alles goed op slot zit Moet inderdaad unlock zijn

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    9,750
    Aangenomen dat mt.lock echt de MT referentie exclusief maakt. Dat zou dan beschermen tegen MT interne inconsistentie.

    Een andere thread kan wel nog steed de MT reference veranderen (stel dat dat gebeurt op het "try" moment). Gebruik daarom een locale variable.

  7. #7
    Dank je wel voor je uitleg Marcov. Ik heb weer wat geleerd. Denk alleen niet dat het voor deze situatie handig is omdat ik dan steeds een memory table moet kopiëren. Het is een methode die nog al vaak gebruikt wordt.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •