[elektro] idoosztasi strategia

Moravcsik Szilárd mszilard at contarex.hu
Fri Jul 29 18:35:59 CEST 2011


2011.07.29. 18:05 keltezéssel, Nemeth Tibor írta:
> Hali!
>
> Évtizedek óta írok adatgyűjtő és vezérlő programokat de nem igazán érzem
> hatékonynak ahogy csinálom. Ezzel kapcsolatban kérem tanácsotokat.
> Régen DOS alatt, viszonylag hardverközeli megoldások is szóba jöttek,
> akár hardver interrupt kezelés is. Amióta rákényszerültem a windows-ra
> ezzel már nem kísérletezem. A példák, mivel Delphiben nyomulok, pascal
> szintaxissal lesznek, de gondolom, nem ez a lényeg.
> Nézzük mi is a gondom: A windows arra van kitalálva, hogy a juzer
> kattintgat és ennek hatására lefutnak eljárások, esemény kezelők. Ezek
> rövid lefutású részprogramok. Ezzel szemben egy mérőprogram akár napokig
> is futhat, noha lehetséges, hogy egy hét alatt lesz annyi dolga a
> CPU-nak mint mondjuk egy nagyobb kép elforgatásával, tehát a feladat
> nagyon hosszú és nagyon híg.
> A tennivaló tehát nem sok, ugyanakkor gyakran külső feltételekre kell
> várakozni. Ha ezt így kezelem le:
> while feltetel do;
> akkor teljesen feleslegesen agyonterhelem a gépet, fölösleges
> másodpercenként húszmilliószor megnézni. Terhelés szempontjából jó megoldás
> while feltétel do sleep(200);
> Így csak ötször nézi meg, ez a feladattól függően elég is lehet, közben
> meg csinálhat mást. Ezzel csak egy baj van, a feladat folytatódik, lesz
> még benne száz ilyen és az eseménykezelő amivel elindítottam (pl:gombra
> kattintás) soha nem ér véget és ezért ha közben valami juzer kívánság
> mégis adódna, nem tudom kiszolgálni. Felhasználói oldalról úgy néz ki,
> mintha kifagyott volna a program, nem reagál egérre, gombra.
>
> Ezért programjaimat timer által generált eseményekkel vezérlem. Ezt már
> évek óta csinálom, működik is csak nagyon kényelmetlen ha a feladat
> bonyolódik. Úgy képzeljétek el, hogy a feladat meg van írva, tele
> ciklusokkal elágazásokkal és ahol a fenti példa szerint várakozási van a
> sleep helyett a program kilép a timer eseményből de gondoskodni kell
> róla, hogy az újabb timer eseményre a kihagyott sleep után folytassa.
> Közben, a ki és belépés között a közben fellépő események
> kiszolgálhatók. Globális változókon keresztül módosíthatják a timer
> alatt futó főtevékenység menetét is.
> No ezért most a timer rutin kb. így néz ki:
>
>
> var fazis:integer;
>
> procedure TForm1.Timer1Timer(Sender: TObject);
>
> begin
>      amitmindigkell_eleje;{ebben nincs hosszú várakozás feltételekre}
>      case fazis of
>      1:begin valamitcsinal1; if feltetel1 then inc(fazis) end;
>
>      2:begin valamitcsinal2; if feltetel2 then fazis:=4 else inc(fazis) end;
>
>      3:begin valamitcsinal3; if feltetel3 then fazis:=9 end;
>
>      4:begin valamitcsinal4; inc(fazis) end;
>
>      5:begin valamitcsinal5; if feltetel5 then inc(fazis) end;
> ..............
>
>      end{case fazis};
>      amitmindigkell_vege;{ebben nincs hosszú várakozás feltételekre}
> end{Timer};
>
> Ez a példa egyszerűnek tűnik, de a valóságban gyakran többszintű.
> A valamitcsinalx-ekben esetleg hasonló programrészek lehetnek, tehát nem
> várakozunk, hanem kilépünk.
> Egymásba ágyazott ciklusokat kell félbehagyni és kilépni, ehhez további
> globális változókban tárolt adatok kellenek és hirtelen követhetetlenné
> válik a dolog.
>
> Ti hogyan csináljátok?
> Lehet, hogy meg kellene tanulnom thread-eket Ha ez a megoldás és valaki
>    megdobna egy működő példával megköszönném és persze bármi más jó tanácsot.
>

Szia!

Pár dolog, ami eszembe jut:

1.) Ha várakozni kell egy ciklusban, a ciklus magjában hívd meg a 
Windows üzenetkezelőjét az Application.ProcessMessages metódussal.
Ekkor nem "fagy le" a Windows, minden eseményt kiszolgál.

2.) Te is viszonylag könnyen használhatod a Windows üzenetkezelőjét 
Delphiben direkt üzenet küldéssel. A Help-ben érdemes kutakodni a 
részletekért, Delphi 5-ben pl. a Windows SDK helpje foglalkozik vele 
(pl. Posting ans Sending Messasges) részletesen.

3.) Érdemes lenne foglalkozni a többszálú programozással is. Marco Cantu 
Delphis könyveiben ill. a neten más (Java, C#, C++, stb.) nyelveken is 
sok példa van. Mivel mindegyik a WinAPI-t használja, lényegében minegyik 
ugyanúgy működik. Nézz körül pl. a Prog.hu oldalon.
Itt hirtelen ezt találtam, de ha több időd van, lesz még bőven cikk:

http://prog.hu/tudastar/34097/Delphi+tobbszalusag.html

Üdv:
Szilárd



More information about the Elektro mailing list