[elektro] idoosztasi strategia
Info
info at kiralyelektronika.hu
Sat Jul 30 15:28:39 CEST 2011
Szia !
Előző hozzászólóhoz hasonlóan nem kell önkritika, mert ennek felét 2
hete vettem át én is, éppen szálaztam egy soros portot :) onnan a
felületes ismeretanyag.
> Bocs, feledékeny nagyok, pár éve olvastam, a VMT mindig globális, ezt
> feletettem el. Így már értem, a MY a stacken, csak a mutató
A create tulképp initinstance-t hív amiben getmem van és feltölti a
táblát. A free ellenőrzi saját magát és ha nem nil akkor destructor-t
hív, így nem lesz futási hiba. Sose hívj destructort, csak free-t, de
a destructorban megírhatod a lezárásokat amik szükségesek.
> Ugyan mint fent írtam, nem ismerem sanjos a windows működését, de azért
> azt tudom, hogy a szálak között valahogyan kiosztja a CPU-t. Sejtésem
> szerint, a Create, azon kívül, hogy létrehozza a megfelelő memória
> tartalmakat, valahova bejegyzi ezt az új szálat, hogy beálljon a sorba.
> Gondolom a Suspend/Resume ezt a bejegyzést törli/írja vagy ha van ilyen
> jelzője, teszi inaktívvá/aktívvá. Így van?
A SuspendThread() egy számlálót növel, a resumethread csökkenti. A
szál akkor fut ha a számláló nulla.
> Ezek szerint a szálnak akkor van vége, ha az execute eljut a végén az
> end-hez,amit persze okozhat a terminate=true,de egyéb okból is eljuthat
> oda. Tehát ha már eljutottunk az execute-t lezáró end-ig, van-e még
> jelentősége a terminate változónak ?
A Terminate egy szolgáltatás Neked, mint pl. a Label.caption, nem kell
wm_gettext üzit küldened a kiolvasáshoz, hanem a kezedbe adja. A
Terminated változó is csak ilyen cucc, ott van ha kell használod ha
nem nem kér enni. Viszont ha létrehozáskor true akkor nem is fogja
indítani az executet, ennyi a csavar.
Így van, az execute után az EndThread ha hívódik akkor stackestől
kivágja a rendszer a memből és annyi.
Meglestem a classes.pas-ban, hogy az Execute visszatérése után ha van
freeonterminate akkor lesz free hívva ha nem nem, de a szálat kilövi,
többet nem tudod resume-zni.
> A FreOnTerminate jelentését azt hiszem értem, de ebben például lehet
> jelentősége a terminate változónak. Mondjuk pillanatnyilag nem tervezem
Nincs jelentősége, az a free-lefuttatásához van, nem a terminated
állapothoz.
> Ha már egyszer eljutott az execute az endhez és nem volt free, akkor mi
> a helyzet? Lehet-e újraindítani? Mit csinál a Resume?
Nem lehet, csak free-t tudsz hívni, illetve esetleges visszatérési
értéket kiolvasni.
> Azt, hogy miképpen kell használni és miért szükséges azt értem, a
> részleteket sajnos nem igazán de ez az én hibám, Te megtetted amit lehet.
Létrehozol egy tömböt amiben cardinalok(THandle) vannak. Ebbe a tömbbe
pakolgatod az összes eseményjelző handle-ját amire reagálni akarsz.
Tömb[0] := CreateEvent(nil, false // <- ezt azért ha egyszerre több
aktiválódik nehogy elvesszen egy esemény, ne legyen automatikus
resetevent ébredéskor
false,
nil );
Aztán loop:
case WaitForMultipleObjects(
hányelemű_a_tömb,
@Tömb[0],
false (ne várja meg mindet egyre is éledjen),
INFINITE vagy 100ms időhatáronként legyen egy WAIT_TIMEOUT-od.
) of
WAIT_TIMEOUT: nem volt event csak a megadott idő telt el
WAIT_OBJECT_0 + 0: a tömb első eventje aktiválódott
WAIT_OBJECT_0 + 1: a tömb második eventje aktiválódott
...
WAIT_FAILED: hiba van a paraméterekkel, kilépsz
minden mást nem vesazel figyelembe
Az összes handle-t ne felejtsd el lezárni a CloseHandle()-val.
A handlekat bárhonnan bármikor settelheted resetelheted.
> Ok, ezt értem, dead-lockot már 76-ban is tanították.
Hát aki tanulta annak könnyű...:)
> Hát ezt még nem fogom fel pillanatnyilag, de már látom hol kell túrni a
> helpet. Persze ismerősek ezek, ami sajnos annyit tesz, hogy már régebben
> is nekifutottam és elakadtam, de a remény hal meg utoljára.
Mit? Azt, hogy hogy használj pipet vagy hogy ne fagyaszd meg a progit
? :) A threadból hívható Synchronize() is ilyet csinál tulképpen:
while WaitforSingleObject(hEvent, 20)= wm_Timeout do
Application.ProcessMessages;
Így várakozás közben nem fagy meg a program.
More information about the Elektro
mailing list