Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi prodleva/čekání/pauza

Dobrý den,
neprogramuji dlouho a narazil jsem na problém. Potřebuji aby program "počkal". Hledal jsem to na webu, ale nenašel.

Jak pomocí FORu napsat program, který by každou vteřinu zvýšil proměnnou na následníka? (Žádný Timer)

Jediné co znám je Sleep, který samozřejmě jenom "zmrazí" program. Potřebuji prodlevu, která by umožňovala další zásah do program.

Snad je můj problém srozumitelný.

Děkuji, Lojzan

Předmět Autor Datum
Windows je riadeny udalostami, tak jak to chces robit ty sa programy uz 20rokov zasadne neprogramuju…
MM.. 31.08.2011 19:25
MM..
Troufl bysis na stopky bez Timeru?
Lojzan 31.08.2011 19:38
Lojzan
Stopky su tiez riadene udalsotami. Pri udalosti TlacitkoStart si niekde zapises obsah nejakeho trval…
MM.. 31.08.2011 20:00
MM..
... a to Potřebuji prodlevu, která by umožňovala další zásah do program. srozumitelny neni vobec (…
MM.. 31.08.2011 19:26
MM..
Takhle, jak to chceš ty, to dělám (spíš dělal, když jsem začínal) vyjímečně u osmibitových PICů, ale…
marekdrtic 31.08.2011 19:46
marekdrtic
Prečo má program čakať? Prečo nie Timer? Pomocou for si program tak zacyklíš, že už sa z toho nedost…
pme 31.08.2011 20:31
pme
Vyřešeno. Díky všem. poslední
Lojzan 31.08.2011 20:40
Lojzan

Windows je riadeny udalostami, tak jak to chces robit ty sa programy uz 20rokov zasadne neprogramuju. Ptz v tom tvojom pripade by tvoj program zral 100% CPU, a pritom by nic nerobil len zbytocne spomaloval vsetko ostatne co v PC bezi.

Spravne vo Windows je pouzit timer a callback funkciu. V callback funkcii si mozes zvysovat premenne jake chces, treba si ich ale preistotu nastavit ako critical section.

Stopky su tiez riadene udalsotami. Pri udalosti TlacitkoStart si niekde zapises obsah nejakeho trvaleho pocitadla ktore poskytuje OS alebo samotny HW (napr. WinAPI ma GetTickCount() apod), pre aktualizaciu displaya si nastavis timer od OS napr. na 10x za sekundu a pri kazdom timer evente aktualizujes display stopiek podla rozdielu aktualneo GetTickCount() a zaciatocneho, a pri udalosti TlacitkoStop si zas zistis aktualny GetTickCount() a rozdiel medzi zaciatocnym a aktualnym je celkovy cas medzi Start a Stop a to zapises na display a zruisi ten aktualizacny timer a vratis riadenie windowsm (cakas na dalsi event Start alebo ukoncit aplikaciu atd, aplikacia uz nema co robit).
T.j. vsetky akcie ktore program robi su riadene udalsotami (tlacitko alebo callback aktualizacneho timeru)

Tak pribliznme sa to da robit. Daju sa pouzit aj ine HW timery (HPET apod), zavisi od verzie Win a od PC (to sa potom da dynamicky zistovat ze co dane PC poskytuje za hardwarove timery a s jakou presnostou, a pouzit to s najlepsou presnostou namiesto GetTickCount). Atd.

Jaky mas s tym problem?

Takhle, jak to chceš ty, to dělám (spíš dělal, když jsem začínal) vyjímečně u osmibitových PICů, ale taky se toho všude zbavuju a dělám to přes interrupt, můžu pak mezitím dělat jiný věci (analogie k 100% vytížení CPU a je to to samý, co chceš ty, abys mezitím mohl něco dělat). Navíc, to tvoje for bude závislé na frekvenci procesoru - na 1,5Ghz procesoru to bude 2x pomalejší než na 3Ghz CPU. Jak řekl předřečník, potřebuješ něco jako TTimer, bez toho mě fakt nenapadá, jak jinak to udělat (třeba jsem ale jen nezkušenej, v Delphi nedělám).

Prečo má program čakať? Prečo nie Timer?
Pomocou for si program tak zacyklíš, že už sa z toho nedostaneš...:-)

Keby si napísal presne o čo sa snažíš - určite by sa našlo riešenie.
Môžeš si vytvoriť vlákno, alebo viac vlákien (TThread) a máš po probléme !

Zpět do poradny Odpovědět na původní otázku Nahoru