Results 1 to 5 of 5

Thread: Globale datamodule en threads

Hybrid View

  1. #1

    Globale datamodule en threads

    Hallo hallo,

    In mijn applicatie heb ik één globale datamodule met diverse query componenten die gebruikt worden in bijna al mijn forms (form zijn niet modal, ik gebruik een tabbed document interface). Nu wil ik een query pas openen zodra het nodig is. In principe blijft de query dan open, zodat andere forms die gebruik maken van dezelfde query niet steeds opnieuw de query hoeven te openen. Ik zet per query wel een flag zodat ik weet wanneer een query niet meer de actuele data bevat en ik deze opnieuw moet openen/refreshen. De data in de queries bevatten suggesties die gebruikt worden in mijn edits. Dit is enigszins vergelijkbaar met suggesties in Google. Omdat het hier slechts om suggesties gaat, is het op zich niet strikt noodzakelijk om altijd de meest actuele data te hebben.

    Omdat het aantal queries dat potentieel geopend moet worden voor vertraging kan zorgen en ik UI wel responsive wil houden, wil ik threads gaan gebruiken. Ik zit er al een tijdje over te filosoferen, maar ik heb nog niet het begin van een oplossingen en ik twijfel er zelfs aan of wat ik wil wel mogelijk is.

    Heeft iemand suggesties, leesvoer of alternatieven die me iets verder kunnen helpen in mijn zoektocht naar een oplossing?

    Bij voorbaat dank!

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Ik gebruik nooit een globale datamodule in een thread. Mijn thread heeft zijn eigen connectie en queries. Het enige wat ik doorstuur qua verbinding is een connectiestring meegeven. Het kost je op dat moment een connectie naar de server, maar de meeste vangen dat op.
    Delphi is great. Lazarus is more powerfull

  3. #3
    als kbmmw gebruiker zou ik een opzetje rondom de wib overwegen.

    Hoe groot zijn je tabellen en hoe vaak wisselen ze? Ik heb een vergelijkbare opzet als jij en heb nog nooit last gehad dat het irritant vertraagd, dus vraag me af of het de moeite loont dat in threads te doen. Je hebt geluk dat kbmmw en kbmmemtable in principe threadsafe zijn, maar je ontkomt denk ik niet aan locks bij het updaten.

    Wat mogelijk nog een optie is is gebruik maken van attached tables. Is je connectie traag of je tabellen groot dan zou je nog laokale persistence kunnen overwegen, waarbij je via de wib alleen de wijzigingen stuurt voor updaten van je lokale cache.

  4. #4
    A much easier way, rather than mess with threads and stuff, is to use kbmMW's Scheduler:

    Scheduler.RunNow(procedure
    begin
    UpdateYourData;
    end);

    Which would update run UpdateYourData async. If UpdateYourData affects the display, you should run it like this:

    Scheduler.Run(procedure
    begin
    UpdateYourData;
    end).Synchronized.Activate;

    However this will attempt to synchronize with the main VCL thread, which may result in the delay you want to avoid.

    So instead split up the data update and the visual update and do like this:

    Scheduler.Run(procedure
    begin
    UpdateYourDataNoVisual;
    end)
    .SynchronizedAfterRun(
    procedure
    begin
    DoVisualUpdate;
    end)
    .Activate;

    Check the blog here: https://components4developers.blog/?s=scheduler for scheduler related posts.

    best regards
    Kim/C4D

  5. #5
    Ik gebruik nooit een globale datamodule in een thread. Mijn thread heeft zijn eigen connectie en queries.
    Ja het voelt ook een beetje "not done", maar in deze situatie is het volgens mij wel de beste oplossing.

    als kbmmw gebruiker zou ik een opzetje rondom de wib overwegen.
    Ik gebruik de WIB slechts om de flag te zetten of de data verouderd is, omdat ik het aan de client wil overlaten of er al dan niet nieuwe data opgehaald moet worden en zo ja hoeveel records. Om WIB te gebruiken om alleen wijzigingen te sturen, is in mijn situatie een beetje veel van het goede.

    Code:
    Hoe groot zijn je tabellen en hoe vaak wisselen ze?
    Het gaat hier om suggesties die gebruikt worden in mijn edit en in principe kan ik zelf bepalen hoeveel suggesties per type (klant, product etc. ) ik wil ophalen, maar hoe meer suggesties des te makkelijk wordt de invoer voor de eindgebruiker. Op zich denk ik dat het gebruik van threads voor het ophalen in de meeste gevallen overkill is, maar ik kan me voorstellen dat als er de eerste keer redelijk wat opgehaald moet worden dat het dan iets langer duurt/te lang duurt.

    Ik heb het inmiddels in een thread gestopt en de table gelocked tijdens het ophalen. Het lijkt allemaal te werken. So far so good

    Mijn dank is groot!

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
  •