, har tilføjet en ttimer til din ansøgning, kun for at opdage, at denne begivenhed ikke bliver henrettet, fordi de vigtigste vcl tråd er optaget?,, delphi entreprenør, september 2000, ophavsret pinnacle forlagsvirksomhed, inc. alle rettigheder forbeholdt., vil den rigtige timer vil henrette?,,,,,,,,,, at steve zimmelman, ofte er opfindsomhedens mor, og det var ingen undtagelse.mens jeg var i gang med en microsoft ord /excel - integration, et problem opstod, da jeg var i behandling af dokumenter med synlige ejendom til falske.ord ville vise en dialog rubrik (, at brugeren ikke kunne se) og venter på et svar.jeg behøver vist ikke at sige dette forhindrede gennemførelsen ser ud, som om det blev hængt.jeg havde brug for en måde at tiden og klare ting, hvis det tager for lang tid.så jeg slog en ttimer komponent på den formular, der intervallet for 1000 (et andet), tælles antallet af gange timeren begivenhed henrettet.det lyder godt, ikke?forkert!når ordet dialog rubrik viste sig, blev det ved hjælp af de vigtigste vcl tråd, som igen var ikke giver plads til andre processer, herunder ttimer.så endnu en gang anvendelse viste sig, som om det var hængt.,,, at løsningen er at skabe en tråd, der kan spore den tid, uanset hvor travlt de vigtigste vcl tråd.men at skabe en tråd, hver gang jeg havde brug for denne funktion ikke er den bedste løsning ud fra et samt synspunkt.så jeg skabte et nyt ur komponent, som vil skabe og udnytte sin egen interne tråd og gennemføre en begivenhed metode på et bestemt tidsinterval.,,, tthreadtimer komponent er resultatet.det er blot en underklasse af tcomponent, der forvalter indvendigt gevind.tråden er skabt og ødelagt af komponent.når de har gjort det muligt for ejendom, er rigtigt, tråd er skabt, og hvor falsk, det er ødelagt.jeg ønskede også at sikre, at tråd ikke får skabt under design, mode.jeg tjekkede componentstate før fuldbyrdende metoder:,,,,, procedure tthreadtimer. setenabled (værdi: boolean), begynder, hvis (værdi < > fenabled) så begynde, fenabled: = værdi; //ikke skabe eller dræbe den tråd, medmindre, //app - løber.,, hvis ikke (csdesigning i componentstate), så begynde, hvis fenabled så begynde, ftimereventcount: = 0, fthread: = tthethread. skabe (selv), i slutningen af andet begynder, killthread,,,,,,,,,,,, sidst,,,,,, jeg anvendte en metode kaldet killthread at stoppe den tråd fra fuldbyrdende og fri.før jeg kan ødelægge den tråd, jeg har brug for at være sikker på, at de associerede begivenhed er ikke i midten af forarbejdning.hvis tråden blev befriet, mens begivenheden var at henrette, en undtagelse vil blive rejst, fordi tilfælde ville vende tilbage til en tråd, der eksisterede ikke længere.jeg håndterede det med en simpel boolean - variabel, fontimereventinprogress, det har brug for ægte før tiden begivenhed blev henrettet, og skiftede til falske lige efter det færdige:,,,,, procedure tthreadtimer.killthread;, begynder,,,, fenabled: = falske, hvis (fthread < > - 0) og derefter begynde,, //vente for ontimerinterval begivenhed, //færdig før afslutning af tråd.,, mens fthread. fontimereventinprogress, kan begynde, application.processmessages,,,,,, fthread. afslutte;,, fthread. fri,,,,,, og endelig, fthread: = 0.,, ftimereventcount: = 0,,,,,,,,,,,, - jeg går nu.e del omfatter en tråd objekt, og tråd objekt skal henvisning nogle af komponentens egenskaber og - metoder, jeg brugte skabe konstruktøren af tråd til at fange en henvisning til dens ejer:,,,,, konstruktøren tthethread. skabe (aowner: tthreadtimer), begynder, fontimereventinprogress: = falske,,, vi har brug for at få adgang til nogle af ejeren, //egenskaber fra tråd.,, fowner: = aowner;,,, som skaber (forkert);,,,,,,,, tråden objekt i sig selv er ret enkelt.det er et skabe en konstruktør, udfører, og en ontimer metode.udfør metode udfører bare efter skabe konstruktoeren og er aktive, indtil de henrette metode udgange.jeg brugte den pågældende ejendom for at holde den røde tråd i live, indtil det er udtrykkeligt sagde, at udrejse.afsluttes, skal, når de tråde opsige metode kaldes.i henrette loop, bruger jeg en simpel sleep() pause tråd og vente på den specificerede timer interval.jeg har brug for at være sikker på, application.processmessages tråd har alle de aktuelle behandling af oplysninger inden den fuldbyrdende timeren begivenhed.jeg indgik en ejendom i den vigtigste komponent ringede synchronizeevent.det gør tthreadtimer opfører sig som en standard ttimer komponent, som sammenfatter tilfælde med de vigtigste vcl tråd:,,,,, procedure tthethread. henret;,, begynder, mens ikke - ophævet begynder, application.processmessages;,, søvn (fowner. interval);,, application.processmessages;,, hvis fowner.synchronizeevent så, synkronisere (ontimer), andet ontimer;,,,,,,,,,,, procedure tthethread.ontimer;, begynder, prøv, hvis de er blevet tildelt (fowner. fontimerinterval) så begynde, hvis fowner. for så begynder, fontimereventinprogress: = sandt;,, inc. (ftimereventcount fowner.), fowner.fontimerinterval(fowner);,,,,,,,, og endelig, fontimereventinprogress: = falske,,,,,,,,,,,, er der tre væsentlige dele til tthreadtimer element: den tråd, interval, og timerevent.som tidligere nævnt, tråd er skabt og ødelagt af mulighed for ejendom.så snart den tråd er skabt, timeren er aktive og gennemfører ontimerinterval begivenhed efter det angivne interval periode er udløbet.,,, der er også en funktion til timereventcount det gør nøjagtigt, som navnet antyder.det trin et heltal, hver gang ontimerinterval begivenhed er forarbejdet.dette kan bruges til at se for potentielle time - outs.for eksempel, har du måske det interval, der er fastsat for 1000 (et andet) og tilfælde fælde for timereventcount > = 60.så hvis tilfælde udfører 60 gange, et minut er gået, og du er nødt til at ordne noget i ansøgningen.men husk, det her er en særskilt tråd, så forsøger at manipulere med andre vcl objekter i den røde tråd, kan medføre undtagelser.,,, efter at threadtimer genstand, det tog ikke lang tid at indse, at timeren omstændigheder ikke ville være i stand til at ajourføre vcl objekter, mens hovedsageligt var optaget.for eksempel, hvis du vil se en rekord står i en tabel, mens tabel blev behandlet og resultaterne vises til en tlabel, ville du være uheldig.tlabel ville vente, indtil de vigtigste tråd, gjorde det muligt at ajourføre.så tilbage til den berømte tegnebræt igen.,,, jeg opdagede, at tcanvas, for det meste ikke bruge den røde tråd for en ajourføring.så jeg lavede en ny etiket komponent ringede tcanvaslabel.tcanvaslabel er en underklasse af tgraphiccontrol, og bruger kun lærred ejendom til tegning.,,, jeg har designet tcanvaslabel, så det kan anvendes som en etiket og et progressbar.de egenskaber, fyld, fillpercent, og fillcolor bruges til at male en del af etiketten er nu en anden farve.malingen metode anvendes til at vise indholdet af mærkningen:,,,,, procedure tcanvaslabel. maling;,, var, trect direkte:,,, fleft, ftop: heltal, begynder, //autosize bør fastsættes til falsk, når mærket, //anvendes i en tynd tråd, bortset fra vigtigste, //vcl tråd.,, hvis autosize så, setsize;,,, direkte: = clientrect; //male etiket med primære baggrund farve.,, canvas.brush.style: = bssolid;,, canvas.brush.color: = selvstændig. farve;,, lærred. fillrect (clientrect);,,, hvis (fillpercent > 0) og ffill så begynde, //beregne fylde procentdel.,, direkte. ret: = trunc ((rect.right * (fillpercent /100)), canvas.brush.color: = fillcolor;,, canvas. fillrect (direkte),,,,,, canvas.brush.style: = bsclear;,,, tilpasning af, taleftjustify:,, begynder, fleft: = 0,,,,,,, tarightjustify:,, begynder, fleft: = clientrect. ikke -, textwidth lærred. (overskrift);,,,,,, tacenter:,, begynder, fleft: = trunc ((clientrect.right -, lærred. textwidth (overskrift) /2),,,,,,,,,,,,, tltop: ftop: = 0,,, tlcenter:,, ftop: = trunc ((clientrect.bottom -, lærred. textheight (overskrift) /2), tlbottom:,, ftop: = (self.height -, lærred. textheight (overskrift),,,,,,,,,lærred. textout (fleft, ftop, overskrift); //kraft værket at ajourføre selv.,, lærred. friske;,;,,,,,, er der et par forbehold, du skal passe på, når de bruger begivenheder, der bruger tråde:,,,,,, den autosize ejendom af tcanvaslabel bør fastsættes til falsk, når at ansøgningen.rigtige etiketten bruger vigtigste vcl tråd, så mærkningen ikke opdatere.,,,,,, være sikker på ikke at indeholde nogen standard vcl objekter i dine tråde begivenhed uden omhyggeligt at teste dem eller specifikt til at skabe dem i kode i tråd.,,,,,,, en enkel anvendelse af begge disse komponenter kan findes i de demo - indgår i den ledsagende dokumentation.den enkle begæring, viser forskellen mellem en standard ttimer og uret i tthreadtimer komponent.,,, ttimer tilfælde ajourfører en tlabel med den aktuelle tid hver anden.for at skabe en travl proces, ansøgningen vedlægges 10.000 i et loop.,,,,,, vil i se, at i løbet af både proces, tiden vise stopper for standard ttimer, mens andre etiketter, ajourføres på deres anviste intervaller.
multi - med nye
Previous:hvad er en tframe?
Next Page:punkt i polygon?