C#-ban hogyan tudok egy új szálat indítani, ha a függvényem paramétert vár?
pl:
Thread t = new Thread(fuggveny);
t.Start();
és a fuggvény:
static bool fuggveny(string s)
{
if(s ==valami)
{
return true;
}
else
{
return false;
}
}
Azonban ezt nem engedi a fejlesztőkörnyezet:
string szoveg = "valami";
Thread t = new Thread(fuggveny(szoveg));
t.Start();
Mi a gond? Hogyan tudom ezt megoldani?
Hogy lehet egy külön szálat paraméterekkel indítani?
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public sealed class Thread : CriticalFinalizerObject, _Thread
Remélem, egyikőtöket sem zavar az, hogy a Thread osztály sealed.
Köszönöm mégegyszer a válaszokat. Megértettem az #1 es valaszado altal linkelt peldat.
Ha jol ertem akkor az object, az minden tipusu valtozo. Ezaltal barmi belekerulhet.
Es azt sem tudtam hogy a Start(); metodusba parametert is irhatok.
Ezek szerint van meg mit magolnom boven. Magamban tanulom 3.eve. Viszonylag sok mindent megertettem, nehany het kellett azert egy egy dologhoz hogy felfogjam. :)
Igazabol mar csak arra akarok torekedni hogy a leg hatekonyabban mukodjenek a programjaim.
Dolgoztam dll ekkel volt hogy magam keszitettem es nevterhez csatoltan hasznaltam a dll ben levo fugvenyeket. De ez a konstruktor es az oroklodes kiforgatja az osszes agyamat.
Nem beszelve mikor kulon szal szeretne modositani a ListBox1 -et. Invoke delegate.. Na az a halalom.
Konyvem is van de az a baj hogy amig valaki emberi nyelven nem magyarazza el hogy felfogjam addig csak telnek a hetek es honapok mig megertek valamit. Vagy nem.. Megegyszer koszonom a valaszokat. Ezzel a peldakoddal mar eltudok indulni.
"Ha jol ertem akkor az object, az minden tipusu valtozo."
Nem jól érted.
Komolyan 3 év C# programozás után nem sikerült eljutni odáig, hogy konstruktor???
Ezen ne múljon, elmagyarázom neked, hogy miről van szó. De tuti, hogy le leszek pontozva.
Nos, az öröklődéssel két osztály viszonyát írhatod le. Ha egy életszerű példát akarnék venni, akkor ott vannak a vonatok. Van tehervonat és személyvonat. A kétféle vonatnak legalább két közös tulajdonságát csípőből el tudod mondani:
- tud menni valamerre
- és ezt síneken teszi
Mi lenne, ha nem írnánk le ezt a két tulajdonságot a két osztályunkba, hanem bevezetnénk a "vonat" osztályt, kiemelve abba ezeket a közös jellemzőket?
class Vonat {
.. public UtTipus MinKozlekedik {
.. .. get {
.. .. .. return UtTipus.Sin;
.. .. }
.. }
.. public void Megy(int Sebesseg) {}
}
class SzemelyVonat : Vonat {}
class TeherVonat : Vonat {}
Így a személyvonatunk és a tehervonatunk is örökli azokat a nem private tulajdonságokat és viselkedéseket, amit a vonat tud. (Plusz információ: egy assemblyben vagyunk, így internal és protected internal láthatósági módosítókkal is öröklődni fognak.) De ennél még fontosabb, hogy most a személyvonat és a vonat, valamint a tehervonat és a vonat osztályok közt most már felírható egy viszony:
- minden személyvonat vonat is egyben
- minden tehervonat vonat is egyben
(A személyvonat és a tehervonat közt nincs ilyen viszony). És ez a kódban is szépen megjelenik:
Vonat a = new SzemelyVonat();
Vonat b = new TeherVonat();
Magyarul, minden olyan helyen, ahol Vonat típusú kifejezésnek kell állnia, állhat SzemelyVonat vagy TeherVonat típusú kifejezés is, hiszen "egy SzemelyVonat tud minden olyan dolgot, amit egy Vonatnak tudnia kell" - pontosabban azért, mert a SzemelyVonat osztály a Vonat osztály leszármazottja.
Ehhez tartozik még két nagyon fontos definíció, a statikus típus illetve a dinamikus típus. Nagyon egyszerűen fogalmazva, a statikus típus azt jelenti, hogy "milyen típusú a kifejezésed". A dinamikus típus pedig azt, hogy "milyen típusú az az objektum valójában". Ebben a példában:
Vonat a = new SzemelyVonat();
az "a" változó statikus típusa a Vonat, míg dinamikus típusa a SzemelyVonat. Dinamikus típusra mindig "vissza tudsz állni" típuskényszerítéssel vagy az "as" operátorral:
SzemelyVonat x = (SzemelyVonat)a;
SzemelyVonat y = a as SzemelyVonat;
Hogy mi a különbség a típuskényszerítés (cast-olás) és az "as" operátor között, kérded?
Vonat a = new SzemelyVonat();
TeherVonat x = (TeherVonat)a;
TeherVonat y = a as TeherVonat;
Ha megfigyeled, az "a" változó dinamikus típusa SzemelyVonat és nem TeherVonat, így ez a művelet nekünk nem fog sikerülni. A nagy különbség az, hogy
1) a típuskényszerítés során kivétel keletkezik, míg az "as" operátorral az "y" változó értéke "null" lesz, illetve
2) "as" operátort csak reference-type kifejezések esetében használhatsz, value-type értékek esetében nem (mivel null értéke csak reference-type kifejezéseknek lehet).
És akkor eljutottunk a nagy kérdéshez, hogy mégis mi az az Object. C#-ban, Java-ban és sok más objektum-orientált nyelvekben minden egyes osztály az Object osztály leszármazottja, még ha nem is írod oda. Például, ha csinálsz egy Sajt osztályt:
class Sajt {}
Rögtön láthatod, hogy ez egy Object is egyben:
object o = new Sajt();
Ez olyannyira része a nyelvnek, hogy még a struct-ok is, amik value-type-ok (pl. az int, long, bool, ...), azok is az object-ből származnak:
class System.Object -> abstract class System.ValueType -> struct System.Int32
Ebből kifolyólag ilyet is lehet csinálni:
object a = 5;
A ParameterizedThreadStart delegate éppen ezért választotta az object-et, mert így tetszőleges típusú paramétert adhatsz át:
[ComVisibleAttribute(false)]
public delegate void ParameterizedThreadStart(object obj)
Ennek nagy hátránya, hogy valójában sosem lehetsz biztos, hogy azt kapod-e, amit kapnod kellene. Éppen ezért kell ellenőrizni, hogy megfelelő dinamikus típusú értéket kapsz-e.
Nem sorrol sorra talulom ahogyan azt a suliban teszik. Kezdtem szamologeppel es ma mar excel tablakkal dolgozom, es dll ekkel. Elegge jo elorelepes szerintem.
Ha eszembe jut egy program akkor addig megyek mig el nem keszul, mind ezt teljesen onalloan gyér angol tudassal teszem. Igy nem ugy tanulom ahogy az meg van irva, hanem mindig az adott problemara keresem a megoldast es ugy tanulok meg egyre tobb dolgot. Igen ezzel az a legnagyobb baj amire mar magam is rajottem kb az elso 1.5 evben, hogy tuti kihagyok valami olyan alap dolgot ami mar hasznos lenne. 3 ev alatt sosem volt konstrukror es azt sem tudom hogy az mi.
De megakarom tanulni.
Az oroklodest valamilyen szinten megertettem de az elegge alacsony. Remek peldat irtal es tobbszor is atolvasom h megertsem. Koszonom szepen.
A helyzet az hogy oroklodest azert nem hasznaltam mert:
Nem ertem annyira hogy lassam a hasznát bevezetni a kod ba.
Igazabol kezdek kifogyni az energiabol amit erre szannek.. Hebe hoba fekapja az agyam akkor 1 honapig tart aztan szunetelek mig eszembe jut valami...es kezdodik ismet.
Amire szuksegem lenne az egy "rendrakas" a fejemben. Hogy sorrendbe keruljon, tisztazzam hogy mik az alapok.
Egy durva sorrend abbol ahogy tanultam.
1 Nehany valtozo es par console metodus.
2 Szamologep.
3 FileStream/StreamW/R
4 WebRequest
5 class es lathatosag(fugvenyek es eljarasok)
6 Thread
7 Dllimport(itt szembesultem a nevter lenyegerol)
8 excel tablak lezelese algoritmus altal(adatbaziskent)
9 invoke delegate konstruktor oroklodes(itt tartok)
Az adatbazist kb megszamolni sem tudom hanyszor futottam neki.
Iszonyat nehez magamban. Es csak akkor teszek fel kerdest barhol a neten ha mar vegleg nem ertek valamit.
Ami feltunt meg hogy "vissza a kerdesemre kanyarodva"
Kulon szalat nem indithatok csak ha a fugvenyem benne void tipusu?
Mert a fejleszto kornyezet nem engedi.
Lehet az a baja hogy a void az nem rendelkezik visszateresi ertekkel mig a tobbi tipus igen?
Csak void tipusu fugvenyt indithatok el?
Sikerult megertenem a konstruktort.
Talan igy mar konnyebben megertem az oroklodest is.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!