Új hozzászólás Aktív témák
-
zsolti_20
senior tag
Sziasztok! Szeretnék készíteni egy barcode olvasót, a probléma jelenleg az hogy nem használhatok scannert, hanem csak egy kamerát, és vele együtt a képrögzítést. Van rá valamilyen ingyenes módszer hogy a kamera által készített képeket felismerve kiolvassa a bar code tartalmát a program?
-
joysefke
veterán
válasz stickermajom #8088 üzenetére
Kezdőnek (egy félév egyetemi C# oktatás jó régen) milyen szakirodalmat ajánlanátok? Pluralsight, Lynda adott, bookmarkolok ezerrel mindent, ami kezdő szint.
Én is csak ismerkedem a nyelvvel (fél éve), picit már kezd több lenni mint hobbi, írok egy két tapasztalatot, hogy nekem eddig mi jött be.
1,
C# Yellow book, 200-250 oldal
http://www.robmiles.com/c-yellow-book/A könyv egyes részei picit már elavultak, de szerintem az egész egyben mint egy nagyon kezdőknek való tanító könyv nagyon jó. Gyorsan ki tudod végezni, megismertet a nyelv és a keretrendszer fő elemeivel, sok jó példakód van benne és best practicek mint szamárvezető. Ez a könyv nem engedi el a kezed és irányban tart. A könyvhöz tartozik laborjegyzet és két "nagyházi feladat" is útmutatókkal.
Én úgy érzem, hogy nekem érdemes volt anno belerakni a könyvbe, a gyakorlatokba és a nagyházi feladatokba azt a két hét munkát amibe az egész került. Nekem a dolog programozás része nem volt új, ezért egy csomó szájbarágós fejezetet elég volt csupán átlapozni, a legalapvetőbb nyelvi elemek viszont többé kevésbé rögzültek.
2,
Aztán írtam egy csomó kódot, egyszerű dolgokat, algoritmusokat implementáltam, ha valamit nem tudtam, nem működött akkor Google -> stackoverflow, vagy msdn. Általában sikerült egyenesbe hozni a dolgokat, de ilyenkor mindig egy csomó dolgot nem értek, hogy miért az a legjobb megoldás illetve miért pont úgy kell, és hogy hogyan működik a motorháztető alatt.Én úgy vagyok vele, ha éppen egy nagyobb tanulás fázisban vagyok, akkor igyekszem egyes témakörökkel mélységében is megismerkedni, mert különben nincsen lehorgonyozva a tudás, és úgy nem csak sokkal bizonytalanabb az ember, hanem hamarabb is felejt. Ha éppen implementálás fázisban vagyok, akkor nyilván megelégszem a Google-> Stackoverflow féle megoldásokkal, mert akkor haladni akarok.
3,
Most éppen on-off a C# 7.0 in a Nutshell könyvet gyűröm. Ez már nem egy szájbarágós könyv, hanem az aktuális C# és Framework funkciókat írja le témakörökbe csoportosítva érthető magyarázatokkal és példakódokkal, kitér arra is, hogy mi hogyan működik a motorháztető alatt. Itt már eléggé el van engedve az ember keze, de nem hagy teljesen magadra mint egy language reference.Az a jó a C# in a Nutshell-ben, hogy aktuális és vannak online példakódok is hozzá, melyek (nagyrészt) copy-paste-vel könnyedséggel kipróbálhatóak.
Szóval számomra kezdőként a tanulság eddig az, hogy úgy fejlődök/tanulok a leghatékonyabban, ha ciklusosan tanulok pár hétig (nyilván a példakódokat az IDE-ben ki is próbálom) aztán implementálok valamit ami nem teljesen triviális, de fókuszál valamire amit el szeretnék mélyíteni. Implementálás közben meg nem ragadok le tanulással. Utána megint tanulok pár hétig, de mindig az aktuális felkészültségemnek még emészthető mélységben.
[ Szerkesztve ]
-
vlevi
nagyúr
Akárki akármit mond, ez a legjobb könyv , amit programozó használhat
-
sztanozs
veterán
válasz Ereshkigal #8092 üzenetére
erre akartam utalni, de olyabá tűnik nem volt elég szarkasztikus a nézésem...
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
nagyúr
válasz Ereshkigal #8092 üzenetére
how to be professional c# dev in 24 hours
-
Ereshkigal
őstag
válasz stickermajom #8091 üzenetére
Lehet, de abból mit profitál az, aki a topikot olvassa?
Tuti valami szupertitkos anyagot osztott meg veled; kezd érdekelni. -
nagyúr
válasz stickermajom #8088 üzenetére
Privi
-
stickermajom
addikt
Sziasztok!
Kezdőnek (egy félév egyetemi C# oktatás jó régen) milyen szakirodalmat ajánlanátok? Pluralsight, Lynda adott, bookmarkolok ezerrel mindent, ami kezdő szint.
-
amargo
addikt
válasz zsolti_20 #8084 üzenetére
Mint ahogy (#8085) joysefke is írta itt azért egy szervert bele kell helyezni a képletbe (amihez a kliensek bejelentkeznek és onnan a szerver csak oda adja az infókat a klienseknek, hogy felépítsék egymás között a kommunikációt), mert ez a példa a p2p-re szólt csak.
“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
joysefke
veterán
válasz zsolti_20 #8081 üzenetére
nekem a szerver alapú megoldás a szimpi, mert a kliensek a szerver nyilvános címéhez mindig tudnak csatlakozni tcp-n vagy még inkább https-en keresztül, ez után a szerver már tud válaszolni a klienseknek, mert kinyíltak a tűzfalak.
ha tisztán szervermentes üzemmódot szeretnél és mindkét kliensed tűzfal mögött van külön privát hálózatokon, akkor szerver nélkül nekem lehetetlennek tűnik, hogy megtalálják egymást illetve a tűzfalon keresztül fel tudjanak egy kapcsolatot építeni. A kliens oldali tűzfalak befelé csak akkor engednek bármit is, ha a kliens kifelé már kezdeményezte a kapcsolatot...
[ Szerkesztve ]
-
amargo
addikt
-
Keem1
veterán
válasz zsolti_20 #8078 üzenetére
Nem tudom, mennyire kell igényesnek lennie, de talán van egy tippem, ha annyira nem.
Pár éve mókoltam teszt jelleggel hasonlót én is, de nálam nem volt külön szerver program, hanem a kliensek egy DBMS adatbázissal kommunikáltak, oda ment a duma, a kliensek pedig időnként rácsekkoltak, van-e nekik új beszéd.
Nyilván nem a legelegánsabb, legigényesebb megoldás, sőt! De ha a feladat elvégzéséhez és nem díszdobozos prémium apphoz kell, ez egy működőképes, viszonylag gyorsan összehozható cucc lehet. Én amúgy MySQL-t használtam hozzá.Persze, ha nem ez a cél, nyugodtan tekintsd a javaslatomat tárgytalannak, úgyis jön nálam rutinosabb topiktárs hogy javasoljon neked jobbat
-
zsolti_20
senior tag
Sziasztok! Egy chat programot tervezek ahol TCP/IP server-klienst használok. A server-kliens nagyon szépen tud kommunikálni egymással, de klins-klins egyszerűen nem jön össze. Valakinek van ötlete mivel lehetne próbálkozni? A probléma hogy XML,HTTP-t nem vágom, így webes felület nem igazán nyerő.
-
Lacc
aktív tag
Bocsi, ezt a reszt kifejtened bovebben:
"A Changed-et azért ignoráltam, mert a Dto-ban nincs benne, de még van ezen kívül benne, érdemes megmondani, hogy ezekkel ne is akarjon foglalkozni." Ez most egy ilyen nap nalam, hogy lassan fogom fel a dolgomat. (Rosszul aludtam, kave sem segit - ez ma nem az en napom)configuration.AssertConfigurationIsValid();
- ezt probaltam, es amikor lattam, hogy sok hibat dobott, nem is az en modositasomra, vissza paszoltam a labdat a tobbieknek.
Ez a letoljuk nekem az osses problemat, mert a View-on jelentkezik a dolog amit en csinaltam, kozben ok adnak szar inputot-ot valahogy tegnap betelt nalam a pohar...Ezt visszont holnap kiprobalom:
configuration.CompileMappings();
nem nagyon lattam google eredmenyekben.Majd csinalok kesobb magamnak sample-t is megnezem ott hogyan operal ez az egesz.
-
amargo
addikt
A Changed-et azért ignoráltam, mert a Dto-ban nincs benne, de még van ezen kívül benne, érdemes megmondani, hogy ezekkel ne is akarjon foglalkozni.
Továbbá:configuration.AssertConfigurationIsValid();
configuration.CompileMappings();Ebben az esetben már ezen a ponton kiderül, ha a mappelésekkel valami gond van. Persze ez nem véd attól, ha egy null-od van és azon belül akarsz valamit kitölteni (Include problémád pl).
“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
amargo
addikt
Neked elvileg elég lenne ennyi is.
cfg.CreateMap<Location, LocationDto>()
.ForMember(dest => dest.Changed , opt => opt.Ignore())
.ReverseMap();Hopp kicsit elhaladt a topic közben
[ Szerkesztve ]
“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
Lacc
aktív tag
válasz Raftsman #8067 üzenetére
En meg a modelbuilder-t szeretem . De ez van, ezzel kell most dolgozni.
Fluent-es megoldas alatt az NHibarnate-et erted?
A nav property-k NULL-ok, de nem tudom, hogy miert.Koszi Goose-T majd atnezem.
Ha nem tudom berugni a kicsiket, akkor majd nem olyan finoman oldom meg.
-
Raftsman
csendes tag
EF ForeignKey Data Annotation esetében mindkét megoldás helyes. Lásd itt.
Ha FK és PK nevek megegyeznek, akkor konvencionális szinten nincs szükség Data Annotationre sem.
Bár jobban preferálom a fluentes megoldást, előbbi kettő kevert használata szerintem csak nagyobb zavart szokott okozni.
Erősségi sorrend szerint:
1. Fluent
2. Data Annotation
3. ConventionsMappelésről nehéz mit mondani, nav propertyk nem maradnék véletlen null-ok?
Bár én se feltétlen mappelném ki a nav propertyket vagy csak azokat a propertyket tartanám meg a dto-ban amig tényleg szükségesek.[ Szerkesztve ]
-
Lacc
aktív tag
válasz Goose-T #8065 üzenetére
Pontosan melyik reszre gondolsz? "A forráspéldányban (Location) nem null?" Tudnal segiteni source code-dal segiteni?
Elnezest, de ma nem fog az agyam, meg kicsit kiegve is erzem magam.Szerintem ez az egesz automappeles nem is mukodik, mar csak azert, mert latom a controllerben, hogy a kollegak utolag, ott kezzel toltik fel, meg az ICollection-s manytomany relaciokat is. Alapbol nem motivalo a kodbazis.
Meg annyit latok, hogy mas DTO-nal a nested DTO property-k kivannak kommentelve.
Meg vannak itt hulyesegek a kodban. Eddig egesz jol tudtam olvasni, debugalni a kodjaikat, de most ez kifog rajtam, meg hiaba rakok oda a MapperConfighoz BreakPoint-ot nem all meg ott sosem a progi.Kezdek kifogyni az otletekbol
Olyannanl is probalkoztam, hogy mashogy bindingolom.
public LanguageDto Language {get;set;}
helyettpublic string LanugageName {get;set;}
-et hasznalok es akkor a Language.Name property-et kotom ossze a ForMember-rel de semmi.Ranyomtam ezt is a configra:
Mapper.AssertConfigurationIsValid();
Hat mit ne mondjak, csak ugy dobalja a hibakat.[ Szerkesztve ]
-
Goose-T
veterán
A forráspéldányban (Location) nem null?
Azt próbáld még meg, hogy a Location mappelését a végére rakod, hogy addigra be legyen konfigurálva a többi osztály mappelése.Szerk.: most látom, hogy már most is úgy van. Akkor nemtom, kísérletezni kell.
[ Szerkesztve ]
Eladó gitárok: https://tinyurl.com/yc7pawkr *** Rockbandám: https://fb.me/scharlotterhodes *** Gitárelektronikai műhelyem: https://www.fb.me/goosetgitar
-
Lacc
aktív tag
válasz Goose-T #8063 üzenetére
Ertem, csak valahol lattam olyan leirast is a ForeignKey-re ezert kerdeztem.
"Töröld csak ki a ForMember mappeléseket, mert így valószínűleg stack overflowba fut, azért hal le." Az elso verzio pont ilyen volt, hogy nem ForMember. De nem mukodott, Siman Null volt a Language es Currency.
-
Goose-T
veterán
Nem, mert az attribute a tábla nevét kéri, nem a mezőét, és az FK mező felé kell tenni, azt fogja összekötni a megadott tábla PK-jával.
A membereknek meg nem kell külön ForMember mappelést megadni, mert magától is mappeli, ha megegyeznek a propertyk nevei, és van mappelés konfigurálva a típusukhoz (és ebben az esetben van). Töröld csak ki a ForMember mappeléseket, mert így valószínűleg stack overflowba fut, azért hal le.
Eladó gitárok: https://tinyurl.com/yc7pawkr *** Rockbandám: https://fb.me/scharlotterhodes *** Gitárelektronikai műhelyem: https://www.fb.me/goosetgitar
-
Lacc
aktív tag
Hali.
C#-os automapperhez kernek segitseget, mar van egy meglevo rendszer, es en szeretnem ha a relacioban levo modeleket is tudna az automapper kezelni:
Location
public class Location : BaseEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int LocationId { get; set; }
public string LocationNumber { get; set; }
public string LocationName { get; set; }
public string Remark { get; set; }
[ForeignKey("Language")]
public int? LanguageId { get; set; }
public Language Language { get; set; }
[ForeignKey("Currency")]
public int? CurrencyId { get; set; }
public Currency Currency { get; set; }
public DateTime? Changed { get; set; }
public Location()
{
this.Changed = DateTime.Now;
}LocationDTO
public class LocationDto
{
public int LocationId { get; set; }
public string LocationNumber { get; set; }
public string LocationName { get; set; }
public LocationTypes LocationType;
public string Remark { get; set; }
public CurrencyDto Currency { get; set; }
public LanguageDto Language { get; set; }
}Mapper konfiguracio:
cfg.CreateMap<CurrencyDto, Currency>(); cfg.CreateMap<Currency, CurrencyDto>();
cfg.CreateMap<LanguageDto, Language>(); cfg.CreateMap<Language, LanguageDto>();
cfg.CreateMap<Location, LocationDto>()
.ForMember(l => l.Language, opts => opts.MapFrom(source => source.Language))
.ForMember(l => l.Currency, opts => opts.MapFrom(source => source.Currency))
);
cfg.CreateMap<LocationDto, Location>();En, ha a fenti mappelest hasznalom, akkor mintha egy vegtelen ciklus keletkezne, es kifagy a Visual Studio.
De igy is egy ido utan a LocationDto.Language propertije null, mikozben a LanugageID-nek van erteke.En ha jol sejtem, van ennek egy egyszerubb modja is, meg szertnem ha a mapper a Language property-hez hozzadna a LocationDTO-hoz tartozo Language objektumot.
Bar az entityben levo ForeignKey dataattribute is erdekes, nem igy kellene annak lennie?
public int? LanguageId { get; set; }
[ForeignKey("LanguageId")]
public Language Language { get; set; }[ Szerkesztve ]
-
zsolti_20
senior tag
Sziasztok! Van valaki aki érti a ContextMenuStrip-et, felugró ablakokat és a TCP client/server-t? Lenne pár kérdésem felé.
-
martonx
veterán
válasz kw3v865 #8055 üzenetére
A böngészőben futtatsz egy url-t, ahhoz csapd hozzá query string paraméterekként a C#-os változóidat. A query string paramétereket meg ki tudod olvasni JavaScripttel.A többiekhez csatlakozva, ha már olyan fontos ez a térkép, akkor itt lenne az ideje dobni a winforms-os legacy szart, és megírni tisztán Asp.Net Core-osra az egészet.
Én kérek elnézést!
-
kw3v865
senior tag
válasz sztanozs #8056 üzenetére
Köszi a gyors választ, átolvasom ezeket és remélem sikerülni fog. 2 hete láttam először életemben C# kódot...
A lényeg az lenne, hogy van egy WinFormos alkalmazás (ez már adott), amit térképes megjelenítés funkcióval kell bövíteni. Egy térképen meg kell jeleníteni valós időben az autó pozícióját, alaptérképpel és egyéb vektoros rétegekkel együtt. Én csak JavaScriptben tudom megírni (vagyis ez kicsit túlzás, mert nem vagyok programozó, de valahogy összehozom...) az OpenLayers nevű függvénykönyvtár felhasználásával, amit korábban már használtam és elég jól dokumentált, sok példa is elérhető hozzá. Ezt a cefsharp-pal valósítom meg, hogy WinForm-os alkalmazáson belül futni tudjon. A koordinátákat kell átadnom a JavaScriptnek. Illetve a későbbiekben lehet, hogy még mást is, ha lesznek újabb igények.
-
Goose-T
veterán
válasz sztanozs #8056 üzenetére
Ha ez egy ASP.NET projekt lenne, akkor még működhetne is, de itt lovon fordítva ülés esete forog fenn. Egy WinForms alkalmazás futtat egy 3rd party browser controlt, annak kell átadni adatot. Vagy ezzel a módszerrel lehet megvalósítani, vagy üzemeltetni kell a programból egy lokális Web API-t, amit lekérdezgethet a JS.
[ Szerkesztve ]
Eladó gitárok: https://tinyurl.com/yc7pawkr *** Rockbandám: https://fb.me/scharlotterhodes *** Gitárelektronikai műhelyem: https://www.fb.me/goosetgitar
-
sztanozs
veterán
válasz kw3v865 #8055 üzenetére
Amennyiben a JS kliens oldalon fut, úgy rejtett form mezőként vagy cookie-ban tudod átadni (vagy közvetlenül c#-ban beállítod a neki megfeleő javascript változó értékeket).
Szerveroldalon pedig használhatod aClientScriptManager.RegisterClientScriptBlock
funkciót: [link]Egyébként pontosan mit szeretnél?
Mégegyszer végiggondolva szerintem nagyon nyakatekerten állsz a dologhoz
Ez szerintem segíteni fog: [link][ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
kw3v865
senior tag
Sziasztok!
Hogyan tudok C#-os változót használni JavaScriptben?
Visual Studio 2015-ben fejlesztek egy WinForm-os alkalmazást, amely egy böngészőt futtat (cefsharp). A JavaScriptem egy HTML-be van beágyazva, itt szeretném elérni a C#-os változóimat. Természetesen ezt a HTML-t is itt Visual Studioban szerkesztem, a poject reference-he zis hozzá van adva.
Ezzel a módszerrel próbáltam: https://www.codeproject.com/Tips/421207/Accessing-Csharp-Variables-in-JavaScript
De sajnos nem jártam sikerrel. -
zsolti_20
senior tag
Sziasztok! Próbáltam egy online chat programot írni. Minden kész van, szépen fut localhsotban, illetve egy hálózaton lévő gépekkel. De ha külön hálózaton vagyunk egyszerűen a portot nem akarja elfogadni. Próbáltam 80,81,8888, de egyik sem volt jó. Milyen portot lehetséges megadni hogy tudjanak a gépek egymásra csatlakozni?
-
Alexios
veterán
válasz BTminishop #8049 üzenetére
Akkor legyen egy vertikális stackpanel, és soronként egy horizontális, és utóbbiba rakod a négyzeteket, a vertikálisba pedig a horizontálisokat
[ Szerkesztve ]
-
vlevi
nagyúr
válasz BTminishop #8049 üzenetére
Próbáltad már vertikális stackpanelbe rakni a horizontális paneleket, és abba a kockáidat?
Nem ismerem a WPF-t, de máshol ez szokott lenni a megoldás.Még esetleg a droidos gridlayout jutott eszembe, ott ezt úgy oldottam meg, hogy a gridlayout oszlopszámát változattam, és a gridlayout annyi sorba szervezte a feldobált elemeket, ahányra szükség volt az oszlopszámhoz.
Nem tudom, WPF-ben van-e ehhez hasonló.[ Szerkesztve ]
-
Alexios
veterán
válasz BTminishop #8047 üzenetére
A stackpanel vertical és ne horizontal legyen
-
BTminishop
aktív tag
sziasztok,
WPF-ben miért nem tudok egymás alá Grideket tenni? 8*8-as táblát kellene rajzolnom de az alábbi eredményt kapom
A kódom így néz ki :
StackPanel stack = new StackPanel();
stack.Orientation = Orientation.Horizontal;
Content = stack;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
Grid grid = new Grid
{
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Top,
Width = 50,
Height = 50,
Margin = new Thickness(0, y, 0, 0)
};
if (j % 2 == 0)
{
grid.Background = new SolidColorBrush(Colors.Brown);
}
else
{
grid.Background = new SolidColorBrush(Colors.Black);
}
stack.Children.Add(grid);
}
y += 50;
} -
zsolti_20
senior tag
Sziasztok! Régen sokat foglalkoztam a C#-al főleg a főiskola alatt, de mostanra eléggé elkopott a tudásom, szeretném kicsit fel eleveníteni ezeket. Valahol találok esetleg leírást hogyan megoldható két gép között a kommunikáció? Szeretnék írni egy olyan programot ahol egy egyszerű beszélgetést lehetne lebonyolítani.
Ez egy gépen még megy is, de a hálózati részével soha nem foglalkoztam még.
-
kw3v865
senior tag
@ BTminishop
A cégnél C#-ban fejlesztenek, a program 90%-a már meg van írva, évek óta ezt használják, most már térinformatikai funkciókat is akarnak.
@amargo
A Cefsharpot találtam, ez egész jónak tűnik, egyelőre nem látom semmi akadályát a használatának. Egyelőre csak a megjelenítés a lényeg: alaptérkép, rajta vektoros rétegek, ki-be kapcsolgatása, illetve valós időben GPS-pozíció megjelenítése. Erre az általam korábban már használt OpenLayers többnyire alkalmas is.A DevExpress-t nem néztem még korábban, de köszi a tippet, elsőre a doksija alapján jónak tűnik. Nem baj, ha fizetős, míg nem túl drága.
[ Szerkesztve ]
-
amargo
addikt
válasz kw3v865 #8040 üzenetére
Winforms ba is megtudsz nyitni böngészőt. Mi a cél? Kell valamire használni az alkalmazáson belül a térképet? Vagy csak valamit meg kell jelenítened?
DevExpress-ben is van térkép, igaz fizetős.“The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”
-
kw3v865
senior tag
Sziasztok!
Kezdő vagyok C#-ban, és a következő kihívással állok szemben: adott egy C#-os, Visual Studioban megírt WinForm-os desktop alkalmazás, amelyet térképes megjelenítővel kell kiegészíteni. Tehát vektoros objektumokat (ki-be kapcsolható rétegekkel) és OpenStreetMap alaptérképet kell kezelnie, természetesen zoom-mal és mozgatás funkcióval ellátva, illetve az aktuális GPS-pozíciót is meg kell jeleníteni. Találtam 2 olyan C#-os függvénykönyvtárat (SharpMap és DotSharp), ami elvileg erre a célra bevethető, viszont nagyon komoly hátrányuk, hogy gyenge a dokumentációjuk (úgy is mondhtanám, hogy nincs is), és API reference sincs.
Erre a célra JavaScriptben én az OpenLayerst használtam már, ami tökéletesen megfelel erre, remek dokumentációja is van. Szerintetek ez műküdhet, hogy megírom a megjelenítőt az OpenLayers-es eszközökkel, majd egy böngészőt integrálok a Win Froms-os alkalmazásba és úgy jelenítem meg a térképet? Mennyire járható út ez szerintetek? Ti mit javasoltok? -
vlevi
nagyúr
válasz martonx #8038 üzenetére
Nekem az egyik bajom az a WPF-el, hogy valami irgalmatlanocsmány módon jeleníti meg a szöveget.
Gondolom azért, mert már nem a WindowsXP-s GDI grafikus megjelenítést használja, hanem Directwrite-ot, de egy átlagos LCD monitoron szinte fáj elolvasni azokat az összevissza álló, elmosódott szövegeket.
Értem én, hogy technológiai fejlődés, mert hardveres gyorsítás, de, ha ennyivel rosszabb a végeredmény, akkor nem ér semmit az egész. -
martonx
veterán
válasz BTminishop #8036 üzenetére
Winforms a múlt, WPF a jelen / közelmúlt, UWP a jelen / jövő. Aztán persze, ahogy MS váltogatja a technológiáit, ki tudja, hogy az UWP-vel mi lesz hosszabb távon.
Én kérek elnézést!
-
Alexios
veterán
válasz BTminishop #8036 üzenetére
Érdemes, pl. már csak azért is mert jobban skálázódik különböző felbontásokra.
-
BTminishop
aktív tag
sziasztok
WinForm-ban csinálok már egy ideje egy grafikus interfészt egy projekthez. Mostanában nem annyira foglalkoztam ezzel a témával de szerintetek érdemes lenne WPF-ben csinálni inkább, mi a különbség a kettő közt illetve mennyire különböznek?
(nyílván rákerestem de személyes véleményekre vagyok kíváncsi)
[ Szerkesztve ]
-
joysefke
veterán
válasz joysefke #8033 üzenetére
a hiba megvan:
Valamiért nem működik az, hogy menet közben lecserélem a letöltés metódusnak átadott dummy Progress<> objektumot egy igazira. Nem értem, hogy miért, de így van.
Tehát a progress repoltolás itt nem működik a Progress objektum cseréje után sem:
var p = new Progress<double>();
Task t = _youtubeClient.DownloadMediaStreamAsync(streamToDownload, filename, p);
// lecserélem a Progress-t valami olyanra ami csinál is valamit
p = new Progress<double> (value => {....})
await tnem működik.
Nem értem miért nem működik, hiszen a DownloadMediaStreamAsync metódus is az átadott Progress objektumnak a referenciáját használja, _tudtommal_ nem készít róla fizikai másolatot.
szerk:
Uhh bakker, milyen jó volt leírni a problémát, most jövök rá mi a baj[ Szerkesztve ]
-
joysefke
veterán
Istenem hogy néz ez ki
-
joysefke
veterán
WPF
A letöltés szépen működik meg minden, de belefutottam egy problémába, amit nem tudtam megoldani:
szeretném, ha az összes párhuzamos letöltés állapota egy progress csíkon aggregáltan látszódna, tehát letöltött bájtok/összes letöltendő bájt.Na ezt nem tudom megoldani, nem értem, hogy hol a hiba. Attól eltekintve, hogy már ránézésre is ronda. Már többször átstrukturáltam a releváns kódrészletet, de nem akarja az igazságot, a letöltések szépen működnek, de a progress bar nem moccan. debuggolni sem igazán tudom...
A kód:
MainWindow.xaml.csMiután a user kiválasztotta, hogy mit akar letölteni, kreálok egy progress objektumot (ez fogja a teljes letöltés állapotát mutatni) és ezt illetve a cél könyvtárat átadom a _session objektum letöltő metódusának. Ez a metódus minden fájlt egy egy Task-async művelettel tölt le, amelyek egy-egy Progress<double> objektumon keresztül tudják állapotukat visszajelezni. Ezeknek az egyes Progress<double>-oknak a visszajelzéseit szeretném egyetlen egy Progress<double>-ba aggregálni. Na ez nem megy.
private async void _downloadAudios(object sender, RoutedEventArgs e)
{
...
IProgress<double> [B]progress[/B] = [B]new Progress<double>[/B]([B]a =>[/B] _fileProgressBar.[B]Value = a*100[/B]);
[B]await _session.DownloadAudioAsync(_folderPath, progress);[/B]
}Másik fájl
DownloadAudiosAsync:public async Task DownloadAudioAsync(string downloadPath, IProgress<double> progress)
....
List<Task> dlTasks = new List<Task>();
[B]Itt fogom az egyes fájlok teljes méretét illetve az aktuálisan letöltött
bájt-számokat tárolni. Ezek az adatok az aggregáláshoz kellenek.
[/B] Az összes Action<double> delegate hozzáfér ezekhez és ugyanazt látják.
//[B]long[] bytesDownloaded[/B] = new long[_videoDisplayInfos.Count];
//[B]long[] fileSizes[/B] = new long[_videoDisplayInfos.Count];
//Előre előkészítem a Progress objektumoknak az üres helyet. Az első
tömb fogja a valós, a második pedig a dummy (null) Progress objektumokat
tartalmazni. Indokás később
[B]IProgress<double>[] fileDLprogresses [/B]= new IProgress<double>[_videoDisplayInfos.Count];
[B]IProgress<double>[] progressesEmpty [/B]= new IProgress<double>[_videoDisplayInfos.Count];
[B]A dummy tömböt feltöltöm csupa Progress = null referenciával[/B].
Indoklás később.
for (int i=0; i< progressesEmpty.Length; ++i) progressesEmpty[i] = new Progress<double>();
//összes fájl együttes mérete tárolódik itt
long totalBytesToDownload = 0;
[B]//Ezen a for cikluson belül lesznek megkreálva az egyes Action delegate-k,
melyek elkapják a ciklusváltozót és lemásolják azt. Illetve itt lesznek az
egyes Task-async letöltések elindítva.[/B]
//végigmegyünk a letöltendő videókon
for (int i=0; i < _videoDisplayInfos.Count; ++i)
{
//letöltendő videók letöltésre kijelölt streamjeinek adatait kiszedjük
VideoDisplayInfo videoDisplayInfo2 = _videoDisplayInfos[i];
AudioStreamInfo streamToDownload2=_videoDisplayInfos[i].PreferredAudioStream;
//csak ha létezik a videóhoz megfelelő stream
if (streamToDownload2 != null)
//fájladatokat (név, útvonal, kiterjesztés) kiszedem/legyártom
string fileExtension2 = streamToDownload2.Container.GetFileExtension();
string sanitizedFileName2 = Utils.SanitizeFilename(videoDisplayInfo2.Title);
string filename2 = Path.ChangeExtension(Path.Combine(downloadPath, sanitizedFileName2), fileExtension2);
//fájlok méretadatait elmentem
fileSizes[i] = streamToDownload2.Size;
totalBytesToDownload += fileSizes[i];
[B]//Megkreálom az egyes Progress<double> objektumok action delegate-ját.[/B]
//Minden delegate updatelgeti az őt futtató letöltés által letöltött adatmennyiséget
//Majd meghívja az aggregált delegatet
//
Action<double> action = value =>
{
// captured loop iterator
int index = i;
long fileSize = fileSizes[index];
long totalBytesDownloaded;
lock (bytesDownloaded)
{
long oldValue = bytesDownloaded[index];
bytesDownloaded[index] = (long)(value * fileSize);
totalBytesDownloaded = bytesDownloaded.Sum();
progress.Report(totalBytesDownloaded / totalBytesToDownload);
}
};
//megkreálom a valós Progress objektumokat
fileDLprogresses[i] = new Progress<double>(action);
//Elindítom a letöltéseket a dummy (null) Progress objektumokkal.
dlTasks.Add(_youtubeClient.DownloadMediaStreamAsync(streamToDownload2, filename2, progressesEmpty[i]));
[B]//if blokk vége[/B]
}
[B]//for blokk vége[/B]
}
// Miután kiléptem a for ciklusból és az int i ciklusváltozó érvényét vesztette lecserélem
a dummy Progress referenciákat az igazi Progress referenciákra. A for cikluson belül
nem lehet odaadni az igazi Progress referenciákat, mert az Action delegateben
a ciklusváltozó akkor még érvényes.
for (int j = 0; j < progressesEmpty.Length; ++j) progressesEmpty[j] = fileDLprogresses[j];
// bevárom a letöltést
await Task.WhenAll(dlTasks);
}[ Szerkesztve ]
-
nagyúr
Adott egy solution. Egyik projekt MVC és van egy másik projekt amibe Jasmine van telepítve. Az első projekt script file-jaira szeretnék spec-eket írni. Hogyan hivatkozzam be a fileokat a Jasmineos projektbe?
-
joysefke
veterán
válasz Froclee #8028 üzenetére
Barátnőm még naptárból is papírt használ, facebookja nincs etc. Az egyetlen stabil pont, amire biztosan számíthatok, hogy meg fog kérni, hogy offline rakjam rá a YT-ról ezt meg azt a telefonjára. Havonta 10-15-20 számot. Fizetni meg biztosan nem fog ilyen streaming csodákért. Én sem. Én zenét sem hallgatok...
tenyleg csak max gyakorlasnak
tökéletes, gyakorlom a Task-async dolgokat
Dobjuk légyszi ezeket a streaming előfizetéseket, a YT videók audió tartalmának párhuzamos letöltését azóta már megoldottam, már csak az Opus -> mp3 konverzió van hátra, azt holnap este megcsinálom.
[ Szerkesztve ]
-
Froclee
őstag
válasz joysefke #8027 üzenetére
Ez a feladat tenyleg csak max gyakorlasnak jo. Spotify. Megeri, mert sok mindent nyujt, futashoz pl futos playlistet berak vagy barmit. Raadasul a kabellel se kell bohockodni hogy attoltse a zenet.
De a tokonloveshez talan ez a cikk segit: https://stackoverflow.com/questions/20500796/convert-pcm-to-mp3-ogg
[ Szerkesztve ]
-
Keem1
veterán
válasz joysefke #8022 üzenetére
Csak halkan kérdezem: egy zenestream szolgáltatás nem lenne egyszerűbb? Spotify, Google Play Music, Deezer, Apple Music, stb.
Ezres körüli előfizetési díj, több tízmillió zene, és sohat többet nem kell zenét nagy macerával előtúrni, letölteni, esetleg konvertálni.
Csak meg kell keresni, bekattintani (esetleg listához adni) és már hallgatható. Előfizus konstrukcióban van offline mód is. Ja, és vannak edzéshez, futáshoz való listák (is).Én két és fél éve vagyok előfizető, az elején még nem gondoltam így, de mostanra már az a véleményem, hogy youtube-bal, to..enttel bohóckodjon az, akinek két anyja van
[ Szerkesztve ]
-
joysefke
veterán
válasz Goose-T #8023 üzenetére
Neki pont WP van
Mivel azt látom, hogy a YT videóknál az Opus adja a legtöbb bitráta-opciót, ezért az tűnik a legegyszerűbben használhatónak:
-(1) Minden videóból kiszedem a bitrátában a legjobban illeszkedő (192kbps környéke) Opus sávhoz tartozó uri-t
-(2) Letöltöm az Opus kódolású audió fájlt
-(3) Miután lent van, konvertálom mp3-ra.Ez most a terv. Ha lenne 192-es mp3 sáv, egyből azt szedném le, de az alapprobléma az, hogy:
Egy csomó videónak az audióját szeretném egyszerre letölteni, előre nem tudom, hogy ezek milyen kódolásban, milyen sávszélességekben lesznek fent. A végén pedig egységesen mp3-ban szeretném látni őket. A példaképen (fönt) egyértelműen ez az Opus csoda tűnik a legtámogatottabbnak...
-
Goose-T
veterán
válasz joysefke #8022 üzenetére
Miért pont az Opus az érdekes? Az Android pont a Vorbist támogatja natívan, még a beépített rendszerhangok is olyan formátumban vannak (OGG Vorbis, ha úgy jobban ráismernél). Már ha androidos a telefon, bár más lehetőség nemigen van, mert IOS-re nem teszel csak úgy fel zenéket, a WP meg kvázi kihalt.
Eladó gitárok: https://tinyurl.com/yc7pawkr *** Rockbandám: https://fb.me/scharlotterhodes *** Gitárelektronikai műhelyem: https://www.fb.me/goosetgitar
-
joysefke
veterán
Sziasztok!
Le akarok szedni YT-ról automatizáltan (barátnőmnek futáshoz) zenéket, mp3 formátumban. Engem nem érdekelnek túlságosan az ilyen olyan kódolások, csak működjön és legyen legalább 192kbps mp3. És lehetőleg tényleg mp3 kódolásban legyen.
Ezt használom YT librariként:
https://github.com/Tyrrrz/YoutubeExplodeA képen egy tetszőleges YT zeneklipphez kinyert AudioStreamInfo bejegyzéseket lehet látni, összesen öt darabot.
Opus AAC és Vorbis típusú kódolású audióstreamek vannak, mp3 sehol. Opusból van három különböző bitrátával.
Van ezzel az Opussal valakinek valami tapasztalata?
-telefonok media playere lejátssza önmagában vagy ez egy WEB-formátum?
-könnyen konvertálható mp3-má? (értelemszerűen .NET-ben)[ Szerkesztve ]
-
XP NINJA
őstag
Sziasztok!
Regex-eket még nem használtam, és most elakadtam.
MatchCollection m2 = Regex.Matches(html, "<td>
<span style=\"font-style:italic;color:green\">\\s*(.+?)\\s*
</span></td>", RegexOptions.Singleline);Van egy ilyen sorom, ami kigyűjti a két megadott részlet közötti szöveget, de nem tudom összerakni hogy ha a color:red akkor azokat is rakja bele. A sorrend fontos lenne, szóval vagy kapcsolatokkal próbálkoztam de nem működik.
[ Szerkesztve ]
-
Zalanius
tag
válasz BTminishop #8017 üzenetére
Ehhez előbb a Click eventet elfogni képes elemre van szükség. Többféleképpen is neki lehet vágni, ha mindenképpen szeretnél egy mátrixot, akkor azt fel lehet építeni pictureBox vagy hasonló elemekből is, és akkor a tömb minden eleméhez hozzárendelhető egy metódus rajzolási célból.
De itt akár mellőzhetők is a tömbök, ha "canvas" céljából egy pictureBoxot vagy hasonlót alkalmazunk, és a kattintás koordinátáiból állapítod meg utána, hogy a sakktábla melyik mezőjére kell rajzolni. Tegyük fel, hogy adott egy 400*400 pixeles pictureBox (pb), meg valahol a fájlrendszerben egy kép tesztelésre (queen_41.png), ekkor vázlatosan:
const int WIDTH = 50;
const int SIZE = 8;
const int IMGSIZE = 41;
const string IMGPATH = @"T:\queen_41.png";
public Form1()
{
InitializeComponent();
pb.MouseClick += Pb_MouseClick;
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = pb.CreateGraphics();
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
g.FillRectangle((i + j) % 2 == 0 ? Brushes.White : Brushes.Black, i * WIDTH, j * WIDTH, WIDTH, WIDTH);
}
}
}
private void Pb_MouseClick(object sender, MouseEventArgs e)
{
float x, y;
x = e.X - (e.X % WIDTH) + (WIDTH - IMGSIZE) / 2;
y = e.Y - (e.Y % WIDTH) + (WIDTH - IMGSIZE) / 2;
Graphics g = pb.CreateGraphics();
g.DrawImage(Image.FromFile(IMGPATH), x, y);
}[ Szerkesztve ]
--= Zalán =--
-
BTminishop
aktív tag
sziasztok,
winform-ban rajzolok képeket és belerakom őket egy mátrixba, hogy eltudjam érni őket.
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 8; j++) {
rect = new Rectangle(x, y, 75, 75);
cells[i-1, j-1] = rect;
Graphics g = e.Graphics;
g.DrawImage(whiteCell, rect);
x += 75;
}
x = 0;
y += 75;
}Speciel ez egy sakktáblát rajzol ki teszt szempontjából még csak fehér cellákkal. Hogy tudnám elérni azt, hogy egy click eventre rá rajzoljon valamit a mátrixból kiválasztott elemre pl. egy bábút. Grafikai dolgok terén itt nem nagyon vagyok tisztában. Köszi!
-
Pörp
senior tag
Mindenkinek nagyon köszönöm!
-
Zalanius
tag
Még egy variáció alább (.net 4.5+). A fenti kettő amúgy jobb válasz, de eljátszottam kicsit a feladattal async eszközökkel, hátha érdekes lehet. Nem a legszebb a "novekvo" ilyen használata, de ennél a példánál belefér az ilyesmi is, nincsenek más konkurrens részek, amikre még tekintettel kellene lenni. A ReadKey hallgatózás hátránya, hogy ha el is értük a maxot, egy ESC akkor is kell, mielőtt a "Kész..." megjelenhet.
static void Main(string[] args)
{
Console.WriteLine("Befejezés: ESC. Irányváltás: SPACE.");
CancellationTokenSource cts = new CancellationTokenSource();
const int MAX = 1000;
int x = 0;
bool novekvo = true;
Task t1 = Task.Factory.StartNew(async () =>
{
while (!cts.Token.IsCancellationRequested && x < MAX)
{
Console.Write(novekvo ? ++x : --x);
Console.Write(" ");
await Task.Delay(50);
}
}, cts.Token);
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
while (keyInfo.Key != ConsoleKey.Escape)
{
if (keyInfo.Key == ConsoleKey.Spacebar)
{
novekvo = !novekvo;
}
keyInfo = Console.ReadKey(true);
}
cts.Cancel();
Console.WriteLine("Kész. A kilépéshez nyomj meg egy gombot.");
Console.ReadKey();
}--= Zalán =--
-
nmate91
tag
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static int Increase(int count)
{
do
{
while (!Console.KeyAvailable)
{
Console.WriteLine($"count: {count++}");
Thread.Sleep(25);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
return count;
}
static int Decrease(int count)
{
do
{
while (!Console.KeyAvailable)
{
Console.WriteLine($"count: {count--}");
Thread.Sleep(25);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
return count;
}
static void Main(string[] args)
{
Console.WriteLine("Press Space to change, and ESC to stop");
do
{
int count = 0;
count = Increase(count);
count = Decrease(count);
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
}
}Hasonlo, decrease utan megall, ujra spacet nyomva indul, nullarol. Ha nem nullarol kell, csak ki kell tenni eggyel kijjebb a count deklaralast. Ha kell az 1000 hatarnak, csak a do while-nal kondiciokent kikotod.
[ Szerkesztve ]
-
joysefke
veterán
Az egyetlen nehézséget az okozza ebben, hogy a Console.ReadKey() blokkol ha éppen nem volt megnyomva billentyű, ekkor addig vár amíg le nem nyomsz egy billenytűt, azt kiolvassa és csak azután megy tovább a végrehajtás. A
Console.KeyAvailable
segítségével ezt ki lehet küszöbölni, ennek akkor ha true az értéke, akkor volt lenyomva billentyű, amelynek az értéke bufferbe került, ezt ki lehet olvasni a Console.ReadKey()-jel, anélkül, hogy az blokkolna.using System;
using System.Threading;
// NonblockingReadKey
class Program
{
// N > 1
static void Count(int N)
{
//this will store the pressed key
ConsoleKeyInfo consoleKey;
// counter will be the running variable
// starting to count down from N
int counter = N;
// when true: counting down
// when false counting up
bool countingDown = true;
// ends one below zero when counting down and one above N when counting up
while (!(counter==-1 && countingDown) && !(counter == N+1 && !countingDown) )
{
Console.Clear();
Console.Write(counter);
Thread.Sleep(250);
// Console.KeyAvailable == true only if there was a keypress
//in the console
if (Console.KeyAvailable)
{
// reads the keypress
consoleKey= Console.ReadKey();
// reads any remaining keypresses from the buffer
// if you have pressed more then one keys during sleep-time
while (Console.KeyAvailable) consoleKey = Console.ReadKey();
// Immediatelly breaks at reading ESC key
if (consoleKey.Key == ConsoleKey.Escape)
{ Console.Clear(); break; }
//switches the counting direction
// true -> false
// false -> true
// countingDown ^= true; ;)
countingDown = !countingDown;
}
//increments or decrements the counter according to
// the value of countingDown
if (countingDown == true) { --counter; }
else { ++counter; }
}
Console.Clear();
Console.WriteLine("Finished!!!");
}
static void Main(string[] args)
{
Count(100);
}
}[ Szerkesztve ]
-
Pörp
senior tag
Hi!
Azt hogyan tudom megcsinálni, hogy ha pl. egy for ciklussal kiíratom a számokat 1000-ig egymás mellé, akkor egy billentyű lenyomására bármikor megálljon a kiírás, és kezdje el onnantól visszafelé írni? Tehát fusson a program, ami a számok kiírása 1000-ig, de közben mégis várjon billentyűzetről lenyomást, és ha van, akkor annak megfelelően módosuljon a futás. A Thread.Sleep()-el várnék kiírások között hogy legyen idő is billentyűt nyomkodni.
-
Tomi120T
újonc
Sziasztok!
Éppen egy projekten dolgoztam visual studióban (xamarin.android), amikor frissítettem és azóta egyszerűen rossz. Az intent osztályra java.Lang.ClassNotFoundExceptoin dob. Valamikor meg az AppCompatActivity ős osztály használatakor az applikáció futásidőben kifagy, egyszerűtől a bonyolult projekttől mindig ezt csinálja.
Aki a xamarint használja vagy a visual studiót és a legújabb verziót használja azok írjanak már hogy nekik működik-e? Mert van egy sanda gyanúm hogy az új verziót elrontották. Vagy hogy kiderítsük hogy én mit rontottam el. -
joysefke
veterán
Uhh
https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush(v=vs.110).aspx
DeflateStream.Flush Method ()
The current implementation of this method does not flush the internal buffer. The internal buffer is flushed when the object is disposed.
GZipStream.Flush() ugyanez...
Mondjuk továbbra sem értem, miért elegendő, ha a ToArray() a StreamWriter blokkján kívül, de a GZipStream blokkján belül van. Azt várnám, hogy ahogy Te tanácsoltad, a GZipStream blokkja után kellene hogy legyen, hogy biztonságos legyen meghívni a ToArray-t. (mert ekkor a GZipStream is Dispose-olva és ezáltal a bufferje is ürítve lett)
[ Szerkesztve ]
-
joysefke
veterán
Köszi!
1,
Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívásVak vagyok
Próbálgattam a dolgot, és elegendő volt a ToArray() hívást a StreamWriter- using blokkján kívülre rakni, már az is megjavította (úgy hogy a GZipStream using blokkján még belül volt ) (!!!)
Tehát abban igazad van, hogy ki kellett lépni valamelyik using blokkból.2,
A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.OK, ezt értem, de azt nem értem, hogy az én megoldásom miért nem jó, tehát, ha még a legbelső (StreamWriter) using blokkon belül akarom a ToArray()-t megívni backing streamen (MemoryStream), akkor miért nem működik az, hogy szépen visszafele meghívom a Flush()-öket:
sw.Flush(); ds.Flush(); ms.Flush();
aztán meghívom a MemoryStreamen a ToArray()-t.Itt azt várnám, hogy a Flush() hívások után a a MemoryStream mindent tartalmaz amit beleírtam (kiürültek a bufferek), tehát bátran hívhatok ToArray()-t...
Itt ugye asszinkronitás sincsen, tehát abban a pillanatban amikor meghívom a Flush()-t, akkor már minden írás amit előtte kiadtam már megtörtént (bufferbe)És ez működik is úgy, hogy nincsen tömörítés (DeflateStream vagy GZipStream) hanem csak Streamwriter( MemoryStream()) van. Onnantól kezdve, hogy közé ékelek egy GZipStreamet vagy DeflateStream-et, borul az egész...
[ Szerkesztve ]
-
fatal`
titán
válasz joysefke #8006 üzenetére
Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívás, emiatt nem kell mindent bezárójelezni, de a biztonság kedvéért nem árt.
A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.
-
joysefke
veterán
Miért gondoljátok, hogy a Flush() a using blokkon belül felesleges, ha még a using blokkon belül szeretném, hogy a stream konzisztens legyen azzal amit beleírtam:
byte[] data;
using (...)
{
írás....
sw.Flush();
ms.Flush();
data = ms.ToArray();
} -
joysefke
veterán
válasz Zalanius #8005 üzenetére
Köszönöm!
1, az általad javasolt megoldás működik ( )
2, A
Fush()
megléte, meg nem léte nem változtatott semmit. (kipróbáltam)3, Ami megjavította a kódot az ez volt:
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
{
using (StreamWriter sw = new StreamWriter(ds))
{Ezzel pedig hibázik:
using (MemoryStream ms = new MemoryStream())
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
using (StreamWriter sw = new StreamWriter(ds))
{......}Ne röhögjetek ki, de én azt hittem, hogy a kettő egyenértékű. Rengeteg példaprogramot láttam
using (.....)
using (.....)
{...}sablon szerint, illetve a fönti tömörítés nélküli verzióban ami nem hibázik is több using statementet egymás után van, majd a kódblokk...
[ Szerkesztve ]
-
Zalanius
tag
válasz joysefke #8004 üzenetére
Pedig ott a flösch környékén lesz a hiba. Próbáld ki így:
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
{
using (StreamWriter sw = new StreamWriter(ds))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
/* sw.Flush();
ds.Flush();
ms.Flush();*/
}
}
compressedData = ms.ToArray();
}--= Zalán =--
-
joysefke
veterán
Vedd ki a flush hívásokat, ha using blockot használsz, mert szükségtelen. De nem vagyok benne biztos, hogy ez okozza a problémát.
A működőben (tömörítés nélkül) kellenek a flush() hívások, próbáltam, anélkül hibázik :
mire ez meghívódik:data = ms.ToArray()
már mindennek a MemoryStream-ben kell lennie.A nem működő verziók (ami tömörít) pedig nem segít, akár bent van, akár nem. Egyébként mindenfélével próbálkoztam, nincs ötletem..
[ Szerkesztve ]
-
joysefke
veterán
Legyen szíves valaki segítsen. System.IO.Compression-al bohóckodom, biztosan valami bufferprobléma van, de nem látom, hogy hol... Elég béna vagyok
Itt van két nyúlfarknyi kód, az egyikben nincs tömörítés és működik, a másikban van tömörítés és nem működik. Az írásnál nem futok bele exceptionba.
Itt alább ez működik:
Gyártok egy string[] tömböt és elemenként mint szöveget beleírom egy StreamWriter(new MemoryStream)-be. Majd ennek az ellentettje, mindent szépen rendben vissza tud olvasni. Egyszer 1000 utána 10000 elemet próbálok tömöríteni, kiírni.Előre is köszönöm!!!
using System;
using System.IO;
class Program
{
//Gets a string[] array with n data items
public static string[] GetNumbers(int n)
{
string[] numbers = new string[n];
for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
return numbers;
}
// writes the string[] array consisting of n items as text to an underlying memory stream
// after that the backing byte[] data structure of the memory stream is extracted via toArray()
// this byte[] array is used to instantitze a MemoryStream and read back the content as text
// this works as expected
public static void WriteReadStrings(int n)
{
string[] numbers = GetNumbers(n);
byte[] data;
using (MemoryStream ms = new MemoryStream())
using (StreamWriter sw = new StreamWriter(ms))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
sw.Flush();
ms.Flush();
data = ms.ToArray();
}
Console.WriteLine("data size: {0}", data.Length);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
//reading back the compressed stream
using (MemoryStream ms = new MemoryStream(data))
using (StreamReader sr = new StreamReader(ms))
{
while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());
}
}
static void Main(string[] args)
{
WriteReadStrings(1000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
WriteReadStrings(10000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}Ok, és most ugyanez tömörítéssel:
Totálisan nem megy. Ha 1000 elemet próbálok tömöríteni, semmi nem kerül bele a MemoryStreambe, ha 10000-et, akkor meg csak valami 8000 környéki. Biztosan valami buffer hiba van, de hol???using System;
using System.IO;
using System.IO.Compression;
class Program
{
//Gets a string[] array with n data items
public static string[] GetNumbers(int n)
{
string[] numbers = new string[n];
for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
return numbers;
}
// writes the string[] array consisting of n items as text compressed to an underlying memory stream
// after that the backing byte[] data structure of the memory stream is extracted via toArray()
// this byte[] array is used to instantitze a MemoryStream and read back the content as text
// this does NOT work
public static void CompressAndDecompressStringArr(int n)
{
string[] numbers = GetNumbers(n);
byte[] compressedData;
using (MemoryStream ms = new MemoryStream())
using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
using (StreamWriter sw = new StreamWriter(ds))
{
int i = -1;
try
{
for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
Console.WriteLine("Current item: {0} \r\nhit key!", i);
Console.ReadKey();
}
sw.Flush();
ds.Flush();
ms.Flush();
compressedData = ms.ToArray();
}
Console.WriteLine("Compressed data size: {0}", compressedData.Length);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
//reading back the compressed stream
using (MemoryStream ms = new MemoryStream(compressedData))
using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
using (StreamReader sr = new StreamReader(ds))
{
while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());
}
using (MemoryStream ms = new MemoryStream(compressedData))
using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
using (StreamReader sr = new StreamReader(ds))
{
string[] separator = new string[1];
separator[0] = Environment.NewLine;
Console.WriteLine("Split returned {0} lines", sr.ReadToEnd().Split(separator, StringSplitOptions.RemoveEmptyEntries).Length );
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}
static void Main(string[] args)
{
CompressAndDecompressStringArr(1000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
CompressAndDecompressStringArr(10000);
Console.WriteLine("hit key to proceed");
Console.ReadKey(true);
}
}[ Szerkesztve ]
Ú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!
- Logitech G935 Vezeték Nélküli Fejhallgató /// Újszerű // Számla + Garancia
- Sennheiser Epos GSP 370 Gaming fejhallgató // Számla+Garancia //
- Hibátlan Apple MacBook Pro 14" 16/500 2021 M1 Pro Chip ! 3 Hó Jótállás
- ÚJ aktiválatalan Apple iPhone 16 Pro Max 256GB Desert Titánium ! 1ÉV nemzetközi APPLE GARANCiA
- AMD GAMER KONFIGURÁCIÓ/RYZEN 5 4500/16GB/3060Ti/1TB/ Rendelhető
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest