[elektro] idoosztasi strategia

Nemeth Tibor nemeth.tibor798 at t-online.hu
Sat Jul 30 12:22:03 CEST 2011


Hali!

Értem én, az a gond lövésem sincs a wondowshoz, ez amit művelek és 
nagyképűen experimentális programozásnak nevezek lényegében 
hályogkovácsolás.

2011.07.30. 1:26 keltezéssel, Info írta:
>> Ez a gombhoz rendelt eseménykezelő hozza létre a thread-et.
>> Gondolom a MY itt egy olyan memória területet jelent ami a thread
>> példány működéséhez szükséges adatokat tartalmazza. De hogyan lehet ez
>> lokális változója egy eseménykezelőnek, hiszen a thread sok másodperccel
>> az után is fut, hogy az eseménykezelő már kilépett és nyilván
>> felszabadította a stacket.
>
> Jujj. No, nézzük sorban:

Mentségemre legyen, ez egy internetről letöltött példa volt, 
kipróbáltam, működött, tetszett, de az említett dolog szembeötlött.

>
>> procedure TForm1.Button1Click(Sender: TObject);
>> var
>>      MY : TTesztThread ;
>
> Jól tudod, a veremben csinál egy mutatónak helyet.
>
>> begin
>>     MY := TTesztThread.Create(True) ;
>
> A TObject.Create függvényig lefut minden öröklött Create fgv, és a
> foglalás itt történik, a címét visszaadja az objektumnak.
>
> Beteszi az objektum címét a veremben foglalt mutatóba, hogy hívni
> tudja a metódusokat a VMT-ből.

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ó
>
>>     MY.Honnan := 'D:\teszt.vmi' ;
>>     MY.Hova := 'C:\teszt.vmi' ;
>>     MY.Resume ;
>
> A tárolt mutató felhasználásával az objektum részeit eléred, írsz
> bele, futtatod a Resume fgv-t.
>
>> end ;
>
> Naszóval, innentől sehol nem fogod tudni elérni ezt az objektumot.
> Tulajdonképpen eldobtad a címét, magárahagytad.
> Saját magának kell felszabadulni, kilépni a memóriából majd valamikor,
> stb.
>
> Amikor újrahívod ezt a ButtonClicket akkor egy újabb objektum jön
> létre és fut.

Esetemben ezt majd el is kell kerülni, hiszen egyedi hardvert kezel
a szál és ha több példány tenné ezt tragédiába torkollna.

> A baj ezzel a megoldással az, hogy amikor bezárod a processt akkor
> leállnak a threadok ha a process leállításakor nem akarod megváratni.
> Azaz mondjuk félbeszakad a végrehajtás. A processz a szálak csoportja.
>
> Javaslom soha ne dobd el így az objektum címét és kilépéskor akár
> OnClose-ban akár finalizationban érd el a száladat és szólj neki, hogy
> söprés kifele a memből mert a rendszer/user kirúgja hamarosan.
> Az elegáns megoldás az, ha az OnCloseQuery-be teszed és addig nem
> térsz vissza amíg le nem álltak a szálak. Mondjuk felugró ablak "kérem
> várjon" vagy valami.

Köszönöm és megfogadom.

> Még két dolog a szálakhoz delfiből: az egyik, hogy csak az execute()
> maga a szál, az összes többi objektum-elem nem tartozik hozzá.
> Induláskor ha createsuspended false akkor azonnal elindul és ha
> lokális változókat nem inicializálta a rendszer hibásan fogsz futni. A
> fenti példában ezért volt true a suspended, majd beállítótta a loc
> paramokat majd resume/folytatás. Így létrehozás után nem olvassa a
> hülyeséget egyből hanem vár.
Ok. Ezt értem.
> A Suspend/resume nem tudja hol áll a szál. Éppen egy másik belőle
> hívott fgv közepén is megállhatsz ha suspendet hívsz.

Ezt még nem próbáltam és nem is értem illetve gondolok róla valamit de 
nem tudom helyes-e.
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 terminate fgv pedig nem csinál az égvilágon semmit, csak a Treminate
> változónak ad true értéket.
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 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
ennek használatát, de jó lenne tudni hogy is van.

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?

>
> A másik a vizualizálás: sok időt elvesz és ami bonyivá teszi: a win
> alap objektumaira van ráhúzva.  Tehát pl. a TCombobox egy sima Edit
> mező, natúr üzenget az objektumod neki, hogy most így jelenjen meg
> most úgy, stb. No szóval oda akarok kilukadni, hogy a többszálúság
> ugyanazt a fgv-t hívhatja/üzenetet küldheti többször, ezért kitalálták
> a Synchronize() metódust amit a szálból kifelé híváskor kell
> használnod. Tehát az executen-belül, és mégpontosabban akkor ha
> vizuális dolgot hívsz, VCL komponenst. Ez a synchronize azt csinálja a
> háttérben, hogy létrehoz egy eventet, beteszi a száladat a
> waitforsingleobject()-re, talán még lockolja is aztán meghívja a
> kívánt függvényt, majdha visszatért a hívott fgv setevent és
> folytatódik a szál futása.

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.

> Az Application objektum meg ott bugzik egy kicsit a szálakkal, hogyha
> a szálban vársz egy értékre amit ugye VCL-ből kapsz mondjuk checkboxra
> vársz, aztán az alkalmazás is vár a szálra na akkor várhatnak az idők
> végezetéig :) ugyanis a win alap getmessage/processmessage-ja az
> applicationba fut és ő osztja szét a formoknak. Namost ez egy szál,
> meg Te csinálsz másikat és a kimenete is meg a bemenete is ugyanúgy
> állni fog. Nemtom érted-e. Példával:

Ok, ezt értem, dead-lockot már 76-ban is tanították.


> Ha a száladra akarsz várni elegánsan akkor időnként kell
> app.processmsg valahogy így:
>
>   while WaitforSingleObject(hEvent, 20)<>  wm_Timeout do
>      Application.ProcessMessages.
>
> Így az alkalmazás alap szála időnként lekezel 1-1db win üzenetet,
> talán nem veszlik el az egérklikkelés a sorból és meg tudod várni az
> indított szálból küldött eventet.
>
> Mondjuk ide meg már érdemesebb pipet vagy wm_userxxx üziket
> küldözgetni.

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.

Ezer köszönet

                           Németh Tibor






More information about the Elektro mailing list