- Házimozi belépő szinten
- HiFi műszaki szemmel - sztereó hangrendszerek
- Csatába küldte Magyarországon idei csúcs hangprojektoros szettjét a Samsung
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- VR topik (Oculus Rift, stb.)
- Épített vízhűtés (nem kompakt) topic
- Az Apple megszerezné a klubvilágbajnokság közvetítési jogait
- Dell notebook topic
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Milyen belső merevlemezt vegyek?
Hirdetés
-
Letartóztatták a bitcoin-Jézust
it Amerikai adókerülés vádjával, Spanyolországban tartóztatták le a bitcoin-Jézusként ismert Roger Vert.
-
Spyra: akkus, nagynyomású, automata vízipuska
lo Type-C port, egy töltéssel 2200 lövés, több, mint 2 kg-os súly, automata víz felszívás... Start the epic! :)
-
Mozgásban az F1 24
gp A Forma 1 versenyek rajongói hamarosan végre belevethetik magukat az idei epizódba.
Új hozzászólás Aktív témák
-
ArchElf
addikt
válasz Vasinger! #1599 üzenetére
Nem kommenteltem, de szerintem a magyar nevű változók elég beszédesek: PasteBin link
Persze sokkal egyszerűbben is lehetett volna, de szerettem volna úgy megírni, hogy minél több - azért lehetőleg kevéssé felesleges - elem legyen benne.Amúgy splittel tényleg egyszerűbb, nincs az a felesleges ciklusozás:
string[] számok_s = számsor.Split(',');
if (számok_s.Length != SZÁMOK_SZÁMA)
{
Console.Error.WriteLine("A beadott számok száma nem {0}.", SZÁMOK_SZÁMA);
return;
}
foreach (string szám_s in számok_s)
{
if (!int.TryParse(szám_s.Trim(), out számok[számláló]))
{
Console.Error.WriteLine("A {0}. helyen nem szám van.", számláló);
return;
}
else if (számok[számláló] < 1 || számok[számláló] > 5)
{
Console.Error.WriteLine("A {0}. helyen a szám nem 1-5 között van.", számláló);
return;
}
}AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
nagyúr
válasz Vasinger! #1595 üzenetére
Idióta egy feladat... legalább életszerű példa lenne, de ebből így mit tanulsz meg? Gyakorlatilag semmit. Na mindegy.
Szóval az a lényeg, hogy az IndexOf megkeresi az első "," karakter indexét a beolvasott stringben (csak azt vizsgáltam, ha nem üres, de azt is kellene, ha nincs "," benne, meg nincs intre ellenőrzés, meg a szám 1-5 közöttre sem). A string elejéről indulva először a 0. karaktertől keressük. Ha találtunk és még nem értük el a string végét, akkor az előbb megtalált index mögé tesszük a következő körben az IndexOf kiindulási pontját, így már a másodikat fogja megtalálni. Ha még mindig nem értük el a fájl végét, megyünk még egy kört, de már nincs több ",".
Közben az index előtti karaktert számmá alakítva egy összeghez adjuk. Így már meg is van két szám és mivel tudjuk, hogy csak 1 számjegyű számaink vannak, az utolsót úgy vesszük ki, hogy a string vége előtti karaktert alakítjuk számmá és adjuk az összeghez. Közben egy darabszámot növelgetünk 1-től és a végén átlagolunk.
Bugyuta, értelmetlen, de nem egyszerű feladat. Sok szebb, gyorsabb, egyszerűbb megoldás lenne rá.
A kód:
private static void Main(string[] args)
{
string str = Console.ReadLine();
double szum = 0;
if (!String.IsNullOrEmpty(str))
{
int end = str.Length;
int start = 0;
int indexOf = 0;
int darab = 1;
while ((start <= end) && (indexOf > -1))
{
indexOf = str.IndexOf(",", start);
if (indexOf == -1) break;
szum += Convert.ToInt32(str.Substring(indexOf - 1, 1));
start = indexOf + 1;
darab++;
}
szum += Convert.ToInt32(str.Substring(str.Length - 1, 1));
Console.WriteLine(@"Az összeg: {0}",szum);
Console.WriteLine("-----------");
Console.WriteLine(@"Az átlag: {0}", szum/darab);
}
Console.ReadLine();
}ArchElf:
A tanár talán azt sem tudja, mi a TryParse, én bele se mertem tenni, meg a tömb csalás... nem volt benne a kiírásban.[ Szerkesztve ]
-
ArchElf
addikt
Ennyi erővel a substring sem volt benne a kiírásban
Mondjuk jó kis feladat lehet substring és Convert nélkül, csak IndexOf-al is
try/catch-et bele sem mertem raknifor lol:
static void Main(string[] args)
{
double átlag = 0;
int szám = 0;
int index = 0;
int újindex = 0;
int számláló = 0;
string számok = "12345";
Console.Write("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string számsor = Console.ReadLine();
//INDEXOF
while (számláló < 3)
{
újindex = számsor.IndexOf(',', index);
if (újindex < 0 && számláló != 2)
{
Console.Error.WriteLine("Nincs elég szám.");
return;
}
if ((újindex - index != 1) && számláló != 2)
{
Console.Error.WriteLine("Helytelen adatok");
return;
}
szám = számok.IndexOf(számsor[index]) + 1;
if (szám < 1 || szám > 5)
{
Console.Error.WriteLine("Helytelen adatok");
return;
}
átlag += szám;
index = újindex + 1;
számláló++;
}
Console.WriteLine("Az átlag: {0:0.0}", átlag / 3);
}AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
ArchElf
addikt
válasz WonderCSabo #1603 üzenetére
Lehet, még classnév is lehet akármi unicode. Én amúgy nem szoktam használni, csak ilyen hülye példáknál. Sztenderd angol, azt kakukk...
AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
nagyúr
válasz WonderCSabo #1603 üzenetére
Nem lehet. Az ékezet ugyanolyan gonosz, mint a goto. ez a hunglish nézet szerencsére ideje korán elsorvadt
ArchElf:
Elnézést, nem ellened irányult az előbbi, de tényleg soha nem használjuk, sehol - talán suliban, de annak a való élethez 0 köze van, amit ott leadnak sokszor."Ennyi erővel a substring sem volt benne a kiírásban"
De, ez benne volt. SubString és IndexOf, más nem. Generikusokkal vagy még inkább regex-szel ezt pikk-pakk meg lehet oldani. Ráadásul az IndexOf lassú is.
[ Szerkesztve ]
-
ArchElf
addikt
Bocs Write-only üzemmódban voltam - mint általában; ráadásul rendesen túl is bonyolítottam...
A példa minősítésével egyetértek... Nálunk a főiskolán a tanár legnagyobb (saját) programozási eredménye az volt, hogy gombnyomásra át tudta színezni egy textbox hátterét. Látnod kellett volna az arcát, hogy öntötte el a büszkeség komoly műve láttán.
Nem is - egyszer könyvből kimásolt egy drag-and-drop példát (kijelölt elemek áthúzása egyik listboxból a másikba) - igaz megértenie nem sikerült hogy működik, mert egész órán hegesztette, de többet nem tudott kihozni belőle.A másik, amin mosolyogni szoktam, ha eszembe jut(tatják): könyvből leggyorsabban 24 óra alatt lehet megtanulni programozni. Nálunk ez az egyetemen sikerült 20 óra alatt. Olyan sikeresen, hogy miután "megtanultunk" c-ben 20 óra alatt programozni mindenki sikeresen beadott egy tetszőleges párhuzamosítható probléma többszálas megoldását c-ben linux alá (IPC) megvalósítva... Asszem egy emberről tudok a mi évfolyamunkban, akinek ez saját munkája volt.
AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
nagyúr
válasz ArchElf #1607 üzenetére
"Olyan sikeresen, hogy miután "megtanultunk" c-ben 20 óra alatt programozni mindenki sikeresen beadott egy tetszőleges párhuzamosítható probléma többszálas megoldását c-ben linux alá (IPC) megvalósítva..."
Ez ismerős. Nekem is volt hasonló progtanárom. Sosem tanított suliban olyan ember programozásra, aki ebből is élt volna - pedig jó pár nyelvet kellett tanulni. Többet tanultam a suli után 2 hónap alatt, mint addig évek alatt.
[ Szerkesztve ]
-
Vasinger!
nagyúr
Ó emberek köszönöm mindenkinek.
Majd ha lesz időm megnézem őket a 7végén.Kicsit talán túl sokat csináltatok, nem kellett volna bele feltétel vagy egyéb okosságok.
De azért köszi! Írok ha van valami kérdésem. -
emmm
senior tag
Sziasztok!
Egy új munkahelyen dolgozok éppen, és Juniorként elakadtam kissé. Még az alap dolgok sem teljesen tiszták (azért egy öröklődést tudok használni!).
Az aktuális problémám az lenne, hogy egy weblapon szeretnék bekérni egy adatot, pl. egy textboxban - ami szeretnék, az egy UserId - és egy gomb megnyomásával egy másik tesztboxba kiírja a hozzá tartozó User nevét.
Mindezt Entity Frameworkkel és WCF-fel kell megoldanom (.NET 4.0, C#).Addig világos, hogy a gombot megnyomom, az lekéri a beírt adatot. Valami olyasmi elképzelésem volt, hogy létrehozok egy User objektumot, és a UserId mezőjébe beleteszem a Textboxba írt értéket. Majd ezt átküldöm a GetUserNameBack metódusnak.
De ebből hogy lesz UserNév?
A Service oldalon (Service1: Iservice résznél):
public string GetUserNameBack(User user)
{
LibraryEntity le = new LibraryEntity();using (var ctx = new LibraryEntity())
{//ide kéne valami, csak nem tudom, mi...
}
}Vagy elég csak a bekért adatot átküldenem? És akkor hogyan kell megoldani?
Nagyon megköszönném a segítséget!
-
nagyúr
Látom, van már egy User típusod (Entity Data Model-ből van?), aminek gondolom egy property-je a UserId. EF-nek annyi kell, hogy megadod a lekérdezést, ami az Id alapján kiveszi a nevet (talán user.UserId?).
Sajnos ennyire általános kérdésre csak általánosan lehet válaszolni.
[ Szerkesztve ]
-
Vasinger!
nagyúr
Nos írtam, hogy kell egy olyan program ami ha 3 számot beírunk vesszővel elválasztva, átlagát veszi.
Írtatok 3-an is programot ide nekem, csak egyik sem jó. Mert index of-fal és substringgel szabad csak dolgoznom. Feltételeket, tömböket, ciklusokat meg még nem vettük.
Semmi feltétel nem kell, csak az átlagot beírni, ha nem jól írjuk be akkor fagyjon le a progi.{
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
int i = s.IndexOf(",");
string szam1 = s.Substring(0);
string szam2 = s.Substring(i + 1, 0);
string szam3 = s.Substring(i + 3, 0);
int a = Convert.ToInt32(szam1);
int b = Convert.ToInt32(szam2);
int c = Convert.ToInt32(szam3);
int eredmény = (a + b + c) /3;
Console.ReadLine();
Console.WriteLine("az átlag: ", eredmény);
Console.ReadLine();
}Nos én idáig jutottam, de ez nem megy. 5let? Sürgős lenne, még ma kész kéne lenni.
-
Lortech
addikt
válasz Vasinger! #1612 üzenetére
A formátum "x,y,z" ahol x,y,z rendre az 1..5 intervallum eleme?
Az érdekel, hogy lehet-e bárhol szóköz, tényleg csak egyszámjegyű lehet-e stb.
Ha igen, az általad elmondottak alapján még indexof és substring sem kell.Elmondom mit írtál:
string szam1 = s.Substring(0);szam1 itt egyenlő lesz a beírt szöveggel, mivel az 1 paraméteres substring azt jelenti, hogy a paraméterben kapott indextől visszaadja a stringet.
string szam2 = s.Substring(i + 1, 0);
Az i+1-es indextől kezdve 0 db hosszú stringet ad vissza, magyarul üres stringet.string szam3 = s.Substring(i + 3, 0);
Szintén,csak más indexszel.Console.WriteLine("az átlag: ", eredmény);
-Ez itt nem csinál sokat, ugyanis nem adtad meg a formátumstringben, hogy írja is ki az eredményt >>
Console.WriteLine("az átlag: {0}", eredmény);
vagy Console.WriteLine("az átlag: "+ eredmény);Ékezetet meg ne írjunk már változónévbe, mégha engedi is a fejlesztői környezet.
Olvasnod kéne a dokumentációját azoknak a függvényeknek, amit használsz, és nagyobb figyelmet fordítani rá.
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
char szam1 = s[0];
char szam2 = s[2];
char szam3 = s[4];
double a = Char.GetNumericValue(szam1);
double b = Char.GetNumericValue(szam2);
double c = Char.GetNumericValue(szam3);
int eredmeny = (int)(a + b + c) / 3;
//ha nem elég az egész osztás, használd ezt
//double eredmeny = (a + b + c) / 3;
Console.WriteLine("az átlag: {0}", eredmeny);
Console.ReadLine();--Convert.ToInt32
- ez a karakterkódját fogja visszaadni a karakternek, nem pedig a számot magát char típus esetében, stringnél a számot. (toStringelni is lehetett volna a szam1,2,3-at).Ha nem használhatsz Char.GetNumericValue-t, akkor használhatsz még int.Parse-t is, a Convert.ToInt32 mellett.
[ Szerkesztve ]
Thank you to god for making me an atheist
-
szuhib007
csendes tag
válasz Lortech #1613 üzenetére
Hello! nekem is ez a feladat mert a vasinger oszt. társa vagyok ,de ezzel az a baj hogy mi ilyen "double" meg "GetNumericValue"-t meg "char"-t nem tanultunk,valami primitiv egyszerű dolgokkal kellene megcsinálni! elvileg a tanár aztmondta hogy először megkeresni az első vessző helyét,úgy visszaadni az első számot,aztán megkeresni a második vesszőt és abból visszaadni a 2ik és a 3ik számot és ezután a 3szám átlagát venni!Jólenne ha vki megcsinálná igy is
Köszönöm előre is a segitséget! -
Lortech
addikt
válasz szuhib007 #1614 üzenetére
Jólenne ha vki megcsinálná igy is
Nehéz visszafogottan fogalmazni. Annyi segítséget, sőt, megoldást kaptatok már, hogy ebből igazán össze lehet hozni ezt a gagyi példát, és nem a sültgalambra várni.
Ugye ez nem felsőoktatási programozás órára kell ?[ Szerkesztve ]
Thank you to god for making me an atheist
-
bpx
őstag
tessék, semmi double, char, semmi konverzió, de még indexof/substring se, mert ugye nem szabad/nem tanultátok...
lehet ezt csűrni-csavarni, meg a tanár hülyeségéhez ragaszkodni, és lesz egy ilyen förtelem belőle, inkább el se magyarázom, mert még elrettentő példának is sok és leírni is fájt :static void Main(string[] args)
{
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string szamok = Console.ReadLine();
Console.WriteLine("Átlag: {0}", (szamok[0] + szamok[2] + szamok[4] - 144) / 3);
Console.ReadLine();
}hozzászólásaitok alapján többet tanulhattok az itteniektől, mint attól a tanártól valaha fogtok
-
nagyúr
Ez az egész feladat valóban primitív, ahogy írták... a kitalálója is az lehet. Most ez a jó vicc, hogy szívózik agy tanítani akar? Vagy csak menőzik, hogy végre sikerült valami kemény feladatot kitalálnia? "fasság"
Amúgy de, sajnos az IndexOf és a SubString kötelező elem, ha jól értem.
-
nagyúr
Egyébként íme a javított verzió:
Console.WriteLine("Kérem adjon meg 3 számot 1-5 között, vesszővel elválasztva: ");
string s = Console.ReadLine();
int i = s.IndexOf(",");
string szam1 = s.Substring(0, 1);
string szam2 = s.Substring(i + 1, 1);
string szam3 = s.Substring(i + 3, 1);
int a = Convert.ToInt32(szam1);
int b = Convert.ToInt32(szam2);
int c = Convert.ToInt32(szam3);
int eredmény = (a + b + c) / 3;
Console.WriteLine(String.Format("az átlag: {0}", eredmény));
Console.ReadLine();Hibák:
- s.Substring(0) nem jó, kell a startIndex és a hossz, vagyis s.Substring(0,1), illetve így is jó, de az s.SubString(0) a teljes stringet fogja visszaadni.
- sok volt a ReadLine();
- kiíratásnál ez nem ír ki paramétert:
"az átlag: ", eredmény", mert nem mondtad meg neki, hogy a paramétert is írja ki.
A helyes használat felsorolás így:
"az átlag: {0}", eredmény". Ha több van, akkor "az átlag: {0}, {1}", eredmény, param2"A feladat maga 0/10 pont, mert értelmetlen, a megoldás 7/10, mert hibás volt. Átmentél, de a tanár nem.
[ Szerkesztve ]
-
bpx
őstag
ma egy ~2 órás kínlódás után saját káromon megtanultam, hogy C#-ban a struct nem threadsafe, még szinkronizációval sem, sajátos működési elvéből adódóan
persze mikor már nagyon gyanús volt a dolog, rákerestem neten, aztán rögtön felvilágosodtam ...gondoltam egyszerűsítek és class helyett structot csinálok, mert csak pár változó összerakása volt a cél egy struktúrába mindenféle függvény nélkül, hát helyette jól megszivattam magam...
-
Gregorius
őstag
Pár félreértést eloszlatandó: a class is pontosan annyira threadsafe mint a struct: semennyire.
Az egyetlen különbség a kettő között - ami viszont nagyon komoly különbség - , hogy a classal ellentétben nem a referencia, hanem a tartalom utazik, ahogy passzolgatod. Vagyis a legalapvetőbb alkalmazások (pl. lokális változó) kivételével nem lehet az eredeti helyén egyenként módosítani a tagjait. Ha nem akarod elgáncsolni magad, akkor (kivételes esettől eltekintve) kizárólag immutable struktúrákat csinálsz, vagyis olyat, ami konstrukció után semmilyen formában sem változtatható. Így a fenti hiba koncepcionálisan kiküszöbölhető. -
nagyúr
válasz robotjatek #1621 üzenetére
Nem érdemes, hacsak mondjuk nem képfeldolgozással foglalkozik valaki vagy esetleg natív kód felé interfészek írásakor lehet hasznos.
Azonban a struct legnagyobb "hátránya", vagyis az érték szerinti hivatkozás mellett max. 16 KB lehet az összes taggal együtt, mert a stack-ben tárolódik, kifelé egyetlen értéknek látszik és nincs automatikus GC sem! Ez pedig optimalizáltság szempontjából nem jó hír.
-
Gregorius
őstag
Azonban a struct legnagyobb "hátránya", vagyis az érték szerinti hivatkozás mellett max. 16 KB lehet az összes taggal együtt
Az egyetlen limit, amibe bele lehet ütközni, az a stack overflow valahol 1M környékén (64-bites app esetén kicsit kevesebb, mint 32-bites esetén). De ekkora struct létrehozásához már komolyan trükközni kell egymásba ágyazásokkal, ugyanis a fordító belső limitje miatt egyetlen structnak sem lehet 64k darabnál több fieldje. De ez a limit ugyanúgy vonatkozik classokra is.Megjegyzem az ajánlott struct méret a pár tíz bájt alatt van. Ennél nagyobb structnál már valószínűleg hatékonyabb classt használni. Egy szint fölött túl nagy overhead az egész struct tartalom másolgatása az átadásokkor.
nincs automatikus GC sem
Milyen GC-nek kellene lennie? A struct pont azért tud hatékonyabb lenni adott helyen a classoknál, mert önmagában semmilyen GC-ben nem vesz részt. Ha a stacken foglal helyet, akkor pontosan akkor szabadul fel a memóriaterülete, amikor kiesik a scope-ból. Ellentétben egy class változó által mutatott objektumot adott esetben csak később gyűjt be a GC. Ha boxolva vagy más objektum részeként van a struct a heapen, akkor persze ugyanúgy GC-ződik, mint egy sima class, utóbbi esetben pontosan akkor szabadul fel a területe, mint a tartalmazó objektumé.Ezek szerint nem érdemes C#-ban struct-ot használni?
Kisméretű adatcsomagok tologatására érdemes, ahol szemantikailag is indokolt a használata. Illetve mint az elhangzott P/Invoke esetén gyakran ezt követeli meg a hívás.Van még pár teljesítményprobléma, ami ellenjavallja a structok használatát, de ezek nem a struct jellegéből adódnak, hanem a JIT fordító retardáltságából és idővel valószínűleg megoldódnak.
Továbbá van egy érdekes használati mintája a structnak: hatékony wrappert lehet vele írni, amikor az öröklődés nem megoldható. Ilyenkor ugyanis a struct csak egyetlen objektumreferenciát tartalmaz és ez másolódik mindenhova. Ez gyakorlatilag azt jelenti, hogy a struct többé-kevésbé class szemantikával működik, annak megfelelő a memóriafoglalása is, csak egy rakás másik metódust rá lehet aggatni.
-
bpx
őstag
válasz Gregorius #1622 üzenetére
igen, erről is olvastam
csak átmenetileg oldotta meg a problémát, közben ugyanúgy megszívtam class-szal isúgyhogy segítséget kérnék
adott a következő szituáció:
IIS-en fut egy WCF szolgáltatás, amivel Silverlight kliensek kommunikálnak duplex módon
(silverlightos sakk, emberek belépnek a szerverre, majd egymás ellen tudnak játszani) - de ez lényegtelen, a konkurenciával van a gond
(azt szeretném észlelni, amikor meghal egy kliens, hogy a másik játékos ne csak üljön és várjon a semmire, hanem tudjam jelezni neki)
az ötlet a következőa szolgáltatásban van egy
static List<ClientInfo> clients;
private static readonly object syncLock = new object();ahol
public class ClientInfo
{
public string name; // játékos neve
public IChessClient client; // callback channel referencia
public DateTime lastreply; // utoljára mikor jött tőle válasz
}amikor a kliens hív a szerveren egy Login()-t, az csinál neki egy ClientInfo objektumot, és beteszi a listába
a szolgáltatás statikus konstruktorában csinálok 2 threadet:
- az egyik pl. 20 mp-ként küld egy kérést a klienseknek (PingRequest())
ezekre 1-2 mp múlva jön egy aszinkron válasz, mégpedig úgy, hogy a kliensek meghívják a szolgáltatás PingReply() fv-ét, ami bejegyzi a fenti listába, hogy most ebben az időpontban jött utoljára válasz adott klienstől- a másik meg pl. 60 mp-ként ellenőrzi a fenti clients listát, hogy kik azok, akik már mondjuk 2 perce nem válaszoltak
ezeket törli a clients listából, az ellenfelüket meg (ha van) értesítiahányszor hozzáférek a clients listához, mindig lock(syncLock)-ot használok a kölcsönös kizárás miatt
tehát 3 fő thread van (végrehajtó, "pingelő", ellenőrző)
a "végrehajtó" (Login(), PingReply()) csak ír
a "pingelő" csak olvas, és mindig helyes értéket lát
a probléma az ellenőrző threaddel van, ez olvassa és módosítja is a clients listátha csak 1 kliens van bejelentkezve, akkor minden megy rendben
ha több, akkor 1 db kliensnél nem látja a ClientInfo.lastreply aktuális értékét, hanem csak a létrehozáskori értéket (Login()) látja - viszont az összes többi kliensnél látja a friss értékeket
ez az 1 db ugye nem frissül, ha letelik X perc, a szerver úgy veszi hogy halott, törli
ilyenkor megint lesz 1 db másik, akinél nem látja az ezután érkező friss értékeket, őt is kiszórja
és ez így megy tovább, egyesével kiszór mindenkit amíg csak 1 játékos marad az egész szerveren, úgy hogy közben mindenki szépen válaszolt és folyamatosan volt kommunikáció, "ping"-re is jöttek válaszokha esetleg valaki eljutott volna idáig az olvasásban (), [link] van kód is, csupaszítva, csak a lényeget meghagyva
-
Gregorius
őstag
azt szeretném észlelni, amikor meghal egy kliens, hogy a másik játékos ne csak üljön és várjon a semmire, hanem tudjam jelezni neki
Ezzel a problémával az elmúlt fél évben én is szembesültem, sajnos erre nincs univerzális megoldás. Saját magadnak kell valamilyen keepalive megoldást implementálni. Akár úgy, hogy egy extra metódushívást beleiktatsz a kontraktba, ami periodikusan küld egy dummy üzenetet, akár úgy, hogy a csatornához fejlesztesz hozzá egy nagy adag saját extension-t. Bizonyos esetekben (pl. basicHttpBinding) a csatorna állapotmentes, tehát elvileg sem észlelhető, hogy a kliens jobb létre szenderült, mert a holtidőben semmilyen kapcsolat nincs.A kódhoz kellene még a konfig is. Nagyon sok mindent jobbá lehet tenni vagy katasztrofálisan el lehet rontani egy WCF szolgáltatás konfigurációjával.
Az mindenesetre már látszik, hogy ha void aszinkron hívásokat akarsz csinálni, akkor ajánlott az interfészen az OperationContract-ban megjelölni IsOneWay=true-ként és akkor nem kell külön szálat indítani minden ilyen híváshoz.
[ Szerkesztve ]
-
bpx
őstag
válasz Gregorius #1627 üzenetére
"Akár úgy, hogy egy extra metódushívást beleiktatsz a kontraktba, ami periodikusan küld egy dummy üzenetet"
igen, a PingRequest()/PingReply() kb. ezt csinálja
"A kódhoz kellene még a konfig is. Nagyon sok mindent jobbá lehet tenni vagy katasztrofálisan el lehet rontani egy WCF szolgáltatás konfigurációjával."
az a gond, hogy Silverlight vs. IIS duplex kommunikáció van (amit hát mégegyszer nem biztos, hogy így csinálnék, de most már ez van...), tehát muszáj pollingduplexhttpbinding-et használni (vagy még nettcpbinding-ot lehetne, de szerintem az én esetemben a clients lista konkurrens hozzáférésével lesz valami gond, nem a szolgáltatás konfigurációjával)
egyébként itt a konfig, semmi extra nincs benne (maxOutputDelay="00:00:01" - a kliens 1 mp-enként pollozzon, hogy jött-e neki üzenet)"Az mindenesetre már látszik, hogy ha void aszinkron hívásokat akarsz csinálni, akkor ajánlott az interfészen az OperationContract-ban megjelölni IsOneWay=true-ként és akkor nem kell külön szálat indítani minden ilyen híváshoz."
na ez egy érdekes dolog, ezt így is a csináltam, a kliens (callback channel) összes metódusa
[OperationContract(IsOneWay=true)]
void ... (...)alakú
ha nem így csináltam, akkor amikor a klienshez hozzáadtam a referenciát a szolgáltatáshoz (és feldolgozta a wsdl-t és generálta a megfelelő dolgokat), akkor dobott is egy warning-ot hogy ez így nem fog működni Silverlighttal - tehát ez megvan
ennek ellenére, ha szerver oldalon hívok egy ilyen függvényt, és közben már nincs is kliens - akkor ha lejár a bindingban megadott timeout (2 perc, default 1 perc) kivételt dob, sőt addig a 2 percig még blokkol is (ezért indítottam még ennek is külön threadet és raktam try..catch blokkba
[ Szerkesztve ]
-
Gregorius
őstag
Egy gyors ötlet: dekoráld ki a ChessService-t ezzel:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
Ez megoldhatja az aszinkron hívás gondot.A másik pedig hogy statikus memberek helyett ugyanebbe az attribba az InstanceContextMode.Single-t kell még beírni, mert így egy darab ojjektum létesül a szolgáltatáshoz és ez szolgálja ki az összes klienst. Ha meg egy sincs, akkor nem foglalja semmi az erőforrásokat, mert a szerver is eldobja az objektumot. Ebben az esetben viszont Reentrant helyett a ConcurrencyMode.Multiple kell.
[ Szerkesztve ]
-
bpx
őstag
válasz Gregorius #1629 üzenetére
ez se oldotta meg - de az InstanceContext hasznos volt, nem kellenek statikus tagok, stb
közben próbálkoztam még pár dologgal, szálakat/listát máshogy szervezni, timeout-okkal játszani, de sehogy sem tökéletesjövő hét szerdán leadás, meg doksit is kellene írni hozzá, szóval lehet ez kimarad belőle
-
j0k3r!
senior tag
hello!
a multkor segitettetek beallitani egy OleDbConnection ConnectionStringjet igy:
con.ConnectionString = ConfigurationManager.ConnectionStrings["vp.Properties.Settings.adatokConnectionString"].ConnectionString;ha valaki 1-2 mondatban leirna, hogy ez a ConfigurationManager mit csinal, azt megkoszonnem. (ha kell a komplett project hozza, akkor irjatok pm-et)
elore is koszonom.
some men just wanna watch the world burn...
-
bpx
őstag
az alkalmazásokhoz létre lehet (illetve van, ahol kell) hozni XML formátumú konfigurációs fájlokat (app.config, web.config, stb.), ami több okból is jó, pl. a program változtatása/újrafordítása nélkül is lehet befolyásolni a működését
ezt a ConfigurationManager osztállyal lehet könnyen feldolgozni
amit leírtál, az a konfig fájlból a megadott nevű ("vp.Properties.....") connectionstring XML elemre hivatkozik, és annak a connectionstring attribútumát adja vissza(#1631) Gregorius:
[link] (1.1MB a sok sallang miatt)
ha fordítani is szeretnéd, akkor kell pár dolog:
- VS2010 + .NET 4.0
- Silverlight 4 SDK
- Silverlight 4 Tools
- adatbázist (chess.bak) visszaállítani Management Studio-val (Sql Server 2008 Express)[ Szerkesztve ]
-
Gregorius
őstag
Itt valami többrendbeli probléma van, ugyanis nem a ClientInfo-t tárolod el a listába, hanem a callback channelt. Aztán kicsit odébb az ellenőrző loopban foreach (ClientInfo c in clients) ami gyönyörűen elszáll, ugyanis a listában lévő IChessClient elemeket nyilvánvalóan nem tudja ClientInfo-ra konvertálni. Ráadásul ez nem a main threaden jön, hanem egy háttérszálon, vagyis nem a kliens fog egy faultexceptiont látni belőle, hanem az IIS egyszerűen bedarálja és újraindítja a szolgáltatást.
Ezen túl még olyan hiba is van, hogy egy foreach-en belül módosítod a listát. Ettől az enumerator meghülyül és ugyanúgy exception lesz az eredmény, vagyis ha módosítani akarsz, akkor érdemes a foreach-ben egy ToList()-tel lemásolni a listát (using System.Linq).
Hogy ezek után működni fog-e azt egyelőre még nem látom, de ezeket mindenképpen meg kellene oldani.
Továbbá én a helyedben úgy csinálnám meg a service-t, hogy külön dll-ben van, mert aköré könnyebb szervezni az életed mind fejlesztés mind beüzemelés közben. Fejlesztéskor a VS beépített WcfSvcHost fogja neked futtatni a szolgáltatást minden külső függőség nélkül (egy követelmény van csak: Any CPU-ra kell fordítani), telepítéshez meg csak köré kell szervezned egy külön projektként a "bootstrappert" legyen az IIS, Windows Service vagy egy egyszerű konzolos alkalmazás ami folyamatosan írja a logot a képernyőre.
-
bpx
őstag
válasz Gregorius #1635 üzenetére
az már a csütörtök délelőtti gányolásom eredménye, azóta nem foglalkoztam vele
akkor írtam át, hogy ClientInfo helyett csak a callback channel referenciát tárolja, meg az ellenőrzést is máshogy csinálja (a játékos nevét eleve nem használta semmire, a dátum meg pont az új ellenőrzés miatt nem kell)
az ellenőrző thread csak ott maradt egyelőre, de el se indítom, szóval simán lehet, hogy helytelen, de az nem futigen a foreach-es dolog is előjött, elején ott is van alatta kommentben, hogy hogyan lenne érdemes
a tanácsokat köszönöm
az a baj, hogy közel a határidő, és van egy csomó más dolog, amivel foglalkozni kellene
úgy vagyok már vele, hogy bemutatom ezt a részt kihagyva, úgy legalább működik a játék többi funkciója + nem hal szét random módon a kapcsolat, aztán le van tudva a tárgy legalább...
szerettem volna több dolgot is megvalósítani, de szvsz ez a Silverlight-WCF kombó elég nagy melléfogás lett, sokkal egyszerűbb lett volna vmi (n+1). webes portált csinálni, mint a többiek nagy része, amit összekattintgat az ember 1 nap alatt
szóvalt ezt normálisan legfeljebb önszorgalomból fogom valamikor, ha már felvet a sok szabadidő -
ArchElf
addikt
Én általában összegyűjtöm egy listába a törlendő elemeket, és azon végigzongorázva törlöm az elsőből. Pszeudokód:
// Lista -> amiből törölni akarunk
List<object> delO = new List<object>();
foreach (object o in Lista)
{
if (Torolhető(o))
delO.Add(o);
}
foreach (object o in delO)
{
Lista.Remove(o);
}
delO = null;AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
nagyúr
válasz ArchElf #1637 üzenetére
Ezt nem értem. Átpakolod egyik listából a másikba azokat, amelyek törölhetőek, majd az elsőből kitörlöd és a másodikat nemes egyszerűséggel null-lal teszed egyenlővé... vagyis végső soron elég lenne az első lista törölhető elemeit törölni és kész, nem? 1 sor, így viszont x.
Vagy valami más van a háttérben?
[ Szerkesztve ]
-
bpx
őstag
azt a listát nem lehet ciklus közepén módosítani, amin épp iterálsz, mert egy exception a jutalom
egyébként én is ezt a változatot használom (ArchElf) a program többi részén (pl. a sakk logika ellenőrzésnél), csak a kérdéses helyen félbehagytam a dolgot, és ott úgy maradt -
ArchElf
addikt
Nem egyszerűen kitörlöm az első listából, hanem, mivel a lista elemei nem törölhetők közvetlenül a foreach ciklusban, így az elemeket egyesével végignézem, hogy törlendők-e, ha igen hozzáadom egy másik listához (törlendő elemek listája). Ekkor az első listából nem tudok még törölni (mert invalid lesz az iterátor).
A második ciklusban a törlendő elemek listáján lépkedek végig. Ekkor minden elemre kiadom az elsőlista.Remove(ojjektum) parancsot (ahol az ojjektum a törlendő elemek listájának aktuális eleme). Mivel most a második lista iterátorát használom, így nyugodtan eleht az első listából törölni. A második lista végigjátszása után nyugodtan lehet magát a második listát is törölni (mivel már nincs rá szükség).
Még egy apróság: amennyiben több szálon párhuzamosan is elérjük a listát a futás alatt (szükséges lehet bizonyos esetekben), úgy azt az egész cécó alatt lockolni kell.Remélem érthető volt.
Még egy. Ha a listaelemeket nem lehet rendesen egymáshoz hasonlítani akkor lehet index alapján is törölni, ez viszont macerásabb.
Ebben az esetben egy fordított for ciklussal célszerű megcsinálni, mert így az indexek nem keverednek össze:
for(ix = lista.Length-1; ix >= 0; ix--)
{
if(törlendő(lista[ix]))
lista.RemoveAt(ix);
}De láttam ilyet is a neten:
foreach(object o in new List<object>(lista))
{
if (törlendő(o))
lista.Remove(o);
}AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
Lortech
addikt
válasz ArchElf #1637 üzenetére
Ha sima rendezetlen listáról van szó, egyszerűbb építeni egy új listát a nemtörlendő elemekkel (szűrés), és a referenciáját értékül adni az eredeti listának.
De ha nem 2.0-hoz vagyok kötve, akkor predikátumot használok, ha alkalmazható.Thank you to god for making me an atheist
-
ArchElf
addikt
válasz ArchElf #1640 üzenetére
De összedobtam egy egyszerűt delegate-tel is
Ez a nem prímeket veszi ki egy int listából. Nem nagy szám, de a lényeg asszem látható...
class Primszam
{
static void Main(string[] args)
{
List<int> prim = new List<int>();
for (int ix = 1; ix <= 100; ix++)
prim.Add(ix);
prim.RemoveAll(ix => nemprim(ix));
prim.ForEach(ix => Console.WriteLine(ix));
}
private static bool nemprim(int ix)
{
int ih = Convert.ToInt32(Math.Sqrt(ix));
for (int ir = 2; ir <= ih; ir++)
if (ix % ir == 0)
return true;
return false;
}
}AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
nagyúr
válasz ArchElf #1642 üzenetére
Túlbonyolítod. Nyilván nem úgy értettem, hogy futás közben kirántjuk magunk elól a szőnyeget, de lehet ezt egyszerűbben is.
Ha tudod, melyik elemek törölhetőek (nyilván eldől valahogy), akkor:
var list = new List<string> {"Elso", "Masodik", "Harmadik", "Negyedik"};
var templist = list.Where(element => element.Contains("dik")).ToList();
list = templist;Ha több szál van, akkor meg nem itt kell megfogni, hanem singletont kell használni, de ez nyilván feladattól függ.
[ Szerkesztve ]
-
Lortech
addikt
Singleton vagy nem singleton, annak ebben a kontextusban sok szerepe nincsen. Ha ugyanazt a listát - legyen az singleton vagy tetszőleges példánya az osztálynak - kell elérnie és műveleteket végeznie rajta több szálnak, meg kell oldani a szinkronizációt pl. egyszerű lockolással, ahogy írta, de ez is változó, hogy mikor milyen megoldásra van szükség.
Thank you to god for making me an atheist
-
ArchElf
addikt
Mondjuk itt pont nem törölsz, hanem kiválasztod a nem törlendőket...
Amúgy én utoljára többszálú hálózati szkennelő cuccot csináltam és egy listában voltak a background thread-ek. Abból kellett szinkronizálva törölgetni a megállt threadeket, hogy újakat lehessen a listába beemelni. Mondjuk az még VS.NET 2K5-ben készült XP alá (.NET 2.0) és nem voltak benne ilyen LINQ-es szépségek.
Utólag látom, hogy hülyén csináltam, mert még csak szinkronizálni sem kellett volna...AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
-
Shyro
csendes tag
Sziasztok!
Itt a programom, ami annyit csinál, hogy bekéri a felhasználónevet, jelszót, és az email címet, majd ezeket az adatokat egy új rekordban elmenti az adatbázis megfelelő táblájába.
Ahhoz, hogy meglévő felhasználónevet és emailt ne lehessen megadni a username/email_beker függvényt használom, ami ha talál false értékkel, és ha nem talál létező felhasználót/emailt true-val tér vissza.
A problémám itt jelentkezik, ugyanis a:
MySqlDataReader reader = user_keres.ExecuteReader(); -nél ezt a hibaüzenetet kapom:
"Connection must be valid and open.Az igazság az, hogy előtte a programrészben már megnyitom a "connection"-t, itt:
if (!connect_check)
Connection_Open(); - metódussal.Megpróbáltam kiolvasni try...catchel, hogy mit küld vissza a MySQL, de egyszerüen meghalt a program. Nincs ötletem a dologra, hogy mi lehet a probléma.
Ha valakinek van, annak nagyon megköszönném ha megosztaná velem! -
bpx
őstag
Szia!
2 dolog:
1. Hiába van connection-öd és nyitod meg, ha a commandokat nem kapcsolod össze vele. A commandnak sehol sem adtad meg, hogy milyen kapcsolatot használjon, így persze hogy panaszkodik.
2. SQL paramétert tényleg paraméterrel kellene megadni, nem pedig magát az SQL-t "összeollózni" (sql injection, dbms optimizer).
például így:
MySqlCommand user_keres = new MySqlCommand();
user_keres.CommandText = "SELECT id FROM account WHERE username=?UN";
user_keres.Connection = connection;
user_keres.Parameters.Add(new MySqlParameter("UN", user);
MySqlDataReader reader = user_keres.ExecuteReader();ha minden igaz, akkor MySQLhez ? kell az SQL Servernél megszokott @ helyett a paraméterhez
[ Szerkesztve ]
-
Shyro
csendes tag
Sziasztok!
Megint csak ugyanezzel a problémával fordulnék hozzátok, sajnos ez a hiba újra meg újra megtalál. A helyzet annyiban változott, hogy most elvileg megmondtam a command-nak, hogy milyen kapcsolatot használjon, mégse szándékozik futni. A hibaüzenet ugyanaz.
LINKElőzőleg megcsináltam egy lebutított variációját konzolban, ami szépen is futott. Így bátorkodtam nekiállni a "végleges" verziónak, de hiába egyszerüen nincs ötletem mi lehet megint a hiba.
Biztosan nem valami bonyolult, csak én nem látom, ha valaki tud segíteni annak előre is köszönöm! :/
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Autós topik látogatók beszélgetős, offolós topikja
- A fociról könnyedén, egy baráti társaságban
- eMAG/edigital vélemények - tapasztalatok
- Debrecen és környéke adok-veszek-beszélgetek
- Kerékpárosok, bringások ide!
- Házimozi belépő szinten
- Honor Magic6 Pro - kör közepén számok
- Elektromos rásegítésű kerékpárok
- HiFi műszaki szemmel - sztereó hangrendszerek
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- További aktív témák...
- Panasonic Lumix DC-G9 (V-Log L kiegészítéssel, 4 akkuval)
- Commlite CM-EF-NEX Auto-Focus Adapter (Canon EF - Sony E)
- Üzletből, garanciával, legújabb Asus Vivobook 17" i7-1355U 10 mag 5GHz/16RAM/1TBSSD/17,3"FULLHD
- Üzletből, garanciával DeLL XPS 15 9500 i7-10750H 32GBRAM 1TBSSD/GTX1650Ti 15,6"4KTOUCH
- i5 12400f 3070 gamer pc
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: Ozeki Kft.
Város: Debrecen