Hirdetés
- gban: Ingyen kellene, de tegnapra
- sziku69: Szólánc.
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Brogyi: CTEK akkumulátor töltő és másolatai
- GoodSpeed: Haworth Aloha – egy nemcsak szavakban ergonomikus szék
- VHS digitalizálás
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- GoodSpeed: Kell-e manapság egérpad vagy sem?
Új hozzászólás Aktív témák
-
Karma
félisten
válasz
tototos
#7056
üzenetére
Azért ez messze nem gyerekjáték, mindenképpen kell egy Windows driver ahhoz, hogy hardvereszközt emulálhass. Viszont pont erre a feladatra találtam egy még élő megoldást: vJoystick, ami a szöveg szerint tartalmazza az aláírt drivert, és C# SDK-n keresztül is lehet hajtani.
-
Karma
félisten
válasz
tototos
#6600
üzenetére
Ott valamit nagyon elnézel, az input változó biztosan nem egy szöveget tartalmaz. Mondjuk ha megpróbálod kiíratni, akkor tényleg ezt kaphatod.
Az a helyzet, hogy a LINQ query szintaxis, hasonlóan a legtöbb LINQ metódushoz, nem listát ad vissza, hanem egy IEnumerable-t; leegyszerűsítve egy "képletet", hogy hogy lehet végrehajtani az általad felsorolt műveleteket. Nem is fut végig a stringlistádon ekkor még.
Ha a visszakapott IEnumerable-ön hívsz egy ToList()-et, végigfut a ciklus és megkapod a tényleges listát.
var lines = File.ReadLines(fileName);
var input = (from line in lines
where (!line.Contains("dblink"))
select line).ToList();Így már input egy List<String> lesz, benne a neked kellő sorokkal.
A metódus formában ez így nézne ki, igazából szerintem egy ilyen egyszerű szűrésnél sokkal jobban olvasható:
var lines = File.ReadLines(fileName)
.Where(line => !line.Contains("dblink"))
.ToList();---
A ToListen kívül a ToArray, ToDictionary, ToLookup metódusok hívásakor, továbbá foreach ciklussal vagy XAML bindinggal is kiértékelődik a képlet.
Nagyon oda kell figyelni arra, hogy ahány ilyet hívsz, annyiszor újrakezdi a teljes számolást! Ezért miután a képleted teljes, célszerű a ToListtel materializálni a listát, és így megspórolni a felesleges újraszámolásokat.
---
Csendben kicseréltem a ReadAllLines hívást ReadLinesra. Ennek a verziónak az a hatalmas előnye, hogy nem olvassa fel azonnal a teljes fájlt a memóriába, hanem soronként dolgozza fel, ahogy materializálódik az eredmény, memóriát spórolva. Jobban is passzol a LINQ filozófiájához.
-
kingabo
őstag
válasz
tototos
#6579
üzenetére
A batch file ki tudja saját magát törölni úgy látom: stackoverflow
-
Peter Kiss
őstag
válasz
tototos
#5673
üzenetére
Szia!
Azt hiszem, látszik, hogy semmit.
Ez egy tervezési megfontolás miatt lett így kialakítva.A kódban használhatjuk úgy ennek az osztálynak egy instance-át, hogy tudjuk, van valami a működésében, ami igényli a használata után, hogy megszabaduljunk tőle, dispose-oljuk (a forrás mögött lehetnek unmanaged erőforrások, amiket mindig érdemes lezárni, pl. file strem, database connection és hasonlók). Jelenleg nincs ilyen, de később előfordulhat, hogy szükség lesz rá, illetve az implementált interface is jelzi már ezt a lehetséges viselkedést, készülni kell rá.
-
Peter Kiss
őstag
válasz
tototos
#5621
üzenetére
Kicsit áthegesztettem: Visual Studio 2013-as project
Nyilván nem tudom, működik-e rendesen, de van benne pár ötlet.
Megjegyzések:
- parser-t nem összekeverni: adattárolóval (DataSet), mentő megoldása (CreateFile)
- parser, saver, writer blabla dolgokat mindig érdemes IDisposable interface-szel ellátni
- DataSet ne maradjon véletlenül sem gazdátlanul, mert a ctor-ban alapból van egy GC.SuppressFinalize((object) this); hívás
- nem kell mindennek mindent ismernie
- miért nem XML-lel megy?
- CultureInfo csak parse-olásnál volt állítva, mentésnél nem, de parse esetén sem volt visszaállítva
- a többit nézd meg -
Karma
félisten
válasz
tototos
#5623
üzenetére
Íme:
class LDF_akarmi
{
private DataTable _signals = new DataTable("Signals");
private DataTable _frames = new DataTable("Frames");
public LDF_akarmi()
{
InitTable(_signals, SignalTableColumns);
InitTable(_frames, FrameTableColumns);
}
private static readonly IList<Tuple<string, Type>> SignalTableColumns = new[]
{
new Tuple<string, Type>("Name", typeof(string)),
new Tuple<string, Type>("Size", typeof(byte)),
new Tuple<string, Type>("Initval", typeof(UInt16)),
new Tuple<string, Type>("TypeID", typeof(string)),
};
private static readonly IList<Tuple<string, Type>> FrameTableColumns = new Tuple<string, Type>[]
{
new Tuple<string, Type>("Name", typeof(string)),
new Tuple<string, Type>("ID", typeof(UInt16)),
new Tuple<string, Type>("Size", typeof(byte)),
new Tuple<string, Type>("SlotTime", typeof(Single)),
new Tuple<string, Type>("Transmit", typeof(byte))
};
private void InitTable(DataTable table, IEnumerable<Tuple<string, Type>> columns)
{
table.Columns.AddRange(columns.Select(col => new DataColumn(col.Item1, col.Item2)).ToArray());
}
}Szerintem elég drasztikus a különbség. A DataColumn[] tagváltozóid egyébként meg teljesen feleslegesek, így tömörítve meg még csak létre se jönnek külön. Ja és for ciklus se kellett, hiszen van AddRange metódusa a Columnsnek

Amúgy miért használsz DataSetet meg DataTable-t? Megjelenítésnél kihasználod ezeket az osztályokat? Mert ha nem, akkor valószínűleg jobban járnál, ha a Signalnak és a Frame-nek külön osztályt vezetnél be az ilyet táblás zsonglőrködés helyett.
-
Karma
félisten
válasz
tototos
#5621
üzenetére
Három dolog vágott szembe elsőre:
1) A System.Type.GetType(string) egy törékeny, és teljesen felesleges mellélövés, használd inkább a typeof operátort. Így biztos, hogy nem írod el a névteret, és azt a típust jelenti, amit szeretnél.
Például System.Type.GetType("System.String") helyett typeof(String).
2) Másrészt a kódod rettenetesen redundáns.
a) Például a két konstruktort (filename paraméteres és paraméter nélküli) simán össze tudnád vonni egybe, opcionális paraméterrel vagy a this konstruktor láncolással.
b) Magában a konstruktorban jön ki nagyon, hogy ismételed önmagad: ugyanaz a szerkezet ismétlődik újra meg újra meg újra, copy-paste-tel gondolom egyszerű volt megírni, de ez is nagyon törékeny és karbantarthatatlan. Az oszlopok definícióit ki kéne szervezned egy static readonly tömbbe (benne pl. string+Type Tuple-ökkel), és for ciklussal helyettesíteni az ismétlődő részeket.3) Túl hosszú és monolitikus. A 600 soros blob helyett szét kéne szedni – felelősség szerint – 100-150 soros darabokra.
-
vlevi
nagyúr
válasz
tototos
#5371
üzenetére
Idisposable classoknal erdemes a usingot mindig hasznalni.
En egyszer nagyon megszivtam egy kepkonvertalo progimmal, ahol a kepeket nem usinggal hasznaltam, es parezer kep atkonvertalasa kozben elszallt out of memroyval 8G ram mellett!
Usingba rakva 3-4M volt a max memoriahasznalata a proginak. -
Karma
félisten
válasz
tototos
#5371
üzenetére
Ha nem használsz try-finally-t akkor igen. Ebben az esetben ha bármi hiba történik és exceptionnel robban a kódod, a close nem hívódik meg, míg a using garantáltan lezárja. A finally blockba helyezett close szintén.
Attól még egy invalid path ugyanúgy exceptionnel robban, viszont a fájl meg garantáltan le lesz csukva.
-
Karma
félisten
válasz
tototos
#5251
üzenetére
Ettől még ne akard kódba rakni, mert az nagyon nem oda való, és amúgy is egy undorító félindiai megoldás. A resource-oknak ellenben pont ez a lényege, hogy belefordulnak az assemblydbe.
Ha resx fájlt adsz a projekthez, akkor string konstansként éred el a tartalmakat (és a solutionben egy fájl lesz, benne a két tartalommal); de olyat is csinálhatsz, hogy a solutionben külön fájlok, a kódban meg streamként éred el.
-
drkbl
őstag
válasz
tototos
#4879
üzenetére
Van olyan konstruktora, ahol megadható a kultúrafüggő formázás.
-
válasz
tototos
#4879
üzenetére
Kicsit sokáig állt a hsz-em szerkesztésben

A CurrentCulture.NumberFormat nem jó, mivel vsz nem English formátum van beállítva a gépen.
A default beállításhoz a következőt kell csinálni a kiírás előtt.System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
-
Peter Kiss
őstag
-
Karma
félisten
válasz
tototos
#3883
üzenetére
Nem túloztad el felénk a specifikálást

Például feltételezhető, hogy a sorazonosítóban és a harmadik mezőben (Steering_msg_1:)-es mezőben nem lehet szóköz, és a második mező (256) biztosan szám? Mert ha igen, elég könnyű rá regexet írni, és capture groupokkal kirángatni a megfelelő értékeket. Ha viszont nem lehet feltételezni a szóköztelenséget, akkor nagyobb baj van.
Így pl. fel lehet darabolni, ha igaz a feltételezés: (.+?) ([0-9]+) (.+?): (.*)
C#-ban konkrétan (nem teszteltem!) ilyesmi:
var regex = new Regex(@"(.+?) ([0-9]+) (.+?): (.*)");
var match = regex.Match(input);
if (match.Success)
{
var lineId = match.Groups[1].Value; // fontos! 1-től kezdődnek a groupok!
var something = match.Groups[2].Value;
var something2 = match.Groups[3].Value;
var message = match.Groups[4].Value;
} -
kingabo
őstag
válasz
tototos
#1798
üzenetére
Na megírtam a progit nem nagyzolás miatt csak, hogy tudjak segíteni ha elakadsz/ne ajánljak hülyeséget, nem akarnám 1:1-ben odaadni, inkább jöjj rá a dolgokra Te! (nem szivatásból, csak sok buktató van, amit jó ha magad is megtapasztalsz, így késöbb tudni fogod, hogy hogyan kell megoldani) De igaziból azt is jó lenne tudni, hogy mit tanultál, meg mennyi van meg.
Nagyjából így oldottam meg: gombra katt, ami létrehoz egy új thread-et és feldobja az ablakot, ebben a thread-ben nagy számítás szimulálására létrehozok egy timert, aminek a tick eseményére megnövelem a másik formon a progressbar értékét. Hogy a lyúzer ne tudja kilőni felíratkoztam a formclosing eseményre, ennek az eseménykezelőjében, ha nem végeztem a számolással, akkor az e.Cancel = true; utasítással nem engedem, hogy bezárja. Ha végeztem a számítással bezárom az ablakot.
Ha valamit nem értesz, kevés,... kérdezz nyugodtan.
-
kingabo
őstag
válasz
tototos
#1793
üzenetére
Hali!
BackgroundWorker-rel sokkal könnyebb lenne megoldani, illetve a gombra kattintáskor le kell tiltani az összes formon lévő gombot és nem tud a lyúzer semmire sem kattintani. Vagy ha a gombletiltás nem tetszik, akkor egy bool változót kell deklarálnod a form-hoz, ha elkezdesz számolni igazra állítod, ha vége, akkor false-ra és minden gomb click esemény kezelőjében megvizsgálod, hogy a változó false-e, ha nem(vagyis számolsz), akkor return.
-
FehérHolló
veterán
válasz
tototos
#1757
üzenetére
Így első nekifutásra ha a ConcurrentQueue-t használod, akkor valamivel meg kell fognod a fogyasztó (nálad protokoll) szálat üres queue esetén, különben megzabálja a procit üresjáratban.
Ha blokkolni is szeretnél, akkor szerintem (megint első nekifutásra) hasznosabb lehet a BlockingCollection osztály. Ez blokkolja a fogyasztó (protokoll) szál futását üres queue, a termelő (kártya) szálat pedig teli puffer esetén.De szerintem jobban jársz, ha megvárod Gregorius válaszát. Ő nagyon nagy valószínűséggel jobban ért a .NET 4.0-hoz.
És igen, elég késő van.

-
FehérHolló
veterán
válasz
tototos
#1755
üzenetére
Ez körülbelül arra jó, hogy egy puffert threadsafe módon kezel. Tehát egyszerre csak egy szál férhet az osztály egyes példányaihoz hozzá. Megspórolja egy csomó munkádat, átláthatóbbá teszi a kódot.

Más: Úgy látszik, nem igazán tudtam helyesen írni az előbb. Pedig még nem is ittam szinte semmit. Szóval bocs.
-
FehérHolló
veterán
válasz
tototos
#1748
üzenetére
Gondolom, ez egyértelmű, de több szálon kell megoldanod.
A CAN-t figyelő thread töltsön egy puffert, ami az üzenetek leíróját tartalmazza. Miután megjött X darab (ne egyesével), szóljon a feldolgozó szálnak egy AutoResetEvent típusú példányon keresztül. A feldolgozó szál pedig pakolja ki a puffert, és az üzenet típusától függően dolgozza fel azokat.
Ehhez ami kell MSDN-ről ([link]):
- Linkedlist ([link])
- Szálkezelés ([link]) + tutorialok.
- AutoResetEvent: [link]Konkrét megoldát nem akarok, és nem is tudok mondani, esetleg csak részleteket. Ha új vagy C#-ban és többszálas programozásban, ráadásul a CAN kártya is teljesen új számodra, akkor olyan 30-40 óra körülire saccolom a feladatot.
Ha esetleg a KB monogramra hallgató cégnek csinálod ezt, vagy egy Vector cég által gyártott CAN kártyával akadt dolgod, akkor kérlek vedd fel velem a kapcsolatot privátban!
ArchElf: OnReceive csak a WinFormson alapértelmezett tudtommal. Amilyen CAN wrapperekkel eddig találkoztam, mind ipari szemét volt a Microsoft elképzeléseihez képest.
Ú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!
- LG LCD és LED TV-k
- gban: Ingyen kellene, de tegnapra
- Formula-1
- Samsung Galaxy S25 - végre van kicsi!
- Lexus, Toyota topik
- Hálózati / IP kamera
- Black Friday november 29. / Cyber Monday december 2.
- Samsung Galaxy A54 - türelemjáték
- Porszívók - akkus és klasszikus vezetékes
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- További aktív témák...
- Lenovo LOQ 15IRH8 - 15.6"FHD IPS 144Hz - i5-12450H - 16GB - 512GB - RTX 4050 - Win11 PRO - 1 év gari
- RTX5070/ Ultra9 275HX/ 32GB DDR5/ 15.1' OLED/ Premium Care garancia/ bontatlan, új/ Legion 5
- NZXT Kraken Z53 RGB(fehér)+NZXT H5 Elite ATX(fehér) garancia 2026.01.31-ig
- Apple Watch Ultra, Újszerű,Dobozával, 12 hónap garanciával
- Tamron 28-75mm F/2.8 Di III VXD G2 (Sony E)
- BESZÁMÍTÁS! LG UltraGear 32GR93U-B 32 144Hz IPS UHD 1ms monitor garanciával hibátlan működéssel
- Clevo 1060 6GB Mxm 3.1 laptop videó kártya ingyen házhoz szálitással
- BESZÁMÍTÁS! Gigabyte B450 Aorus Elite R5 5600X 32GB DDR4 512GB SSD RX 6700XT 12GB ZALMAN S2 TG 750W
- GYÖNYÖRŰ iPhone 12 mini 64GB White -1 ÉV GARANCIA - Kártyafüggetlen, MS3849, 100% Akksi
- CORSAIR K100 AIR
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Ha gondoljátok törölhető a comment.
Ez egy tervezési megfontolás miatt lett így kialakítva.






