Hirdetés
-
Spyra: nagynyomású, akkus, 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! :)
-
LG C4 tévé, a népszerű OLED-sorozat legfrissebb tagja
ph Leteszteltük az OLED evo paneles, 4K felbontású, mélynyomókkal is felszerelt, 65 hüvelykes televíziót.
-
Színészek hangjait lopta el egy AI-cég
it Az USA-ban bepereltek egy AI-céget, mert a vád szerint ellopták a színészek hangjait, majd AI segítségével a saját céljaikra használták azokat.
Új hozzászólás Aktív témák
-
ArchElf
addikt
válasz tototos #1748 üzenetére
Biztos van olyan eseménye az osztálynak, hogy OnReceive vagy valami hasonló és azt kell lekezelned... valahogy így:
kezelo.OnReceive += ... (tabbal beadja automatikusan, és létre is hozza a metódust)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]
-
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.
[ Szerkesztve ]
Skynet is real. It's called Google.
-
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.
Skynet is real. It's called Google.
-
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.
[ Szerkesztve ]
Skynet is real. It's called Google.
-
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.
-
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.[ Szerkesztve ]
-
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;
}[ Szerkesztve ]
“All nothings are not equal.”
-
-
-
sztanozs
veterán
válasz tototos #4605 üzenetére
Az a gond, hogy non-greedy formában használod a *-ot.
Próbáld meg csak simán így:
Regex re = new Regex(@"Frames\{.*\}")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...
-
K_Gabor
tag
válasz tototos #4605 üzenetére
Ha tudnád a belső blokkok számát(amit a leírtak alapján kétlek,és persze nem lenne sok belőlük) akkor véleményem szerint össze lehetne rakni regex-el,viszont ha nem,akkor szerintem is a parser lenne a megoldás ahogy Karma is írja.
Hirdetéseim: http://hardverapro.hu/tag/k_gabor_3#aprohirdetesei
-
sztanozs
veterán
válasz tototos #4637 üzenetére
Ráadásul - ha jól rémlik - a ([a-zA-Z_]+,)* nem vesz fel minden értéket, csak az elsőt.
Én ezt csinálnám:
([^:]*):([^,]*),([^,]*),([^,]*);
eselteg, ha az első változó egyben is kellhet:
(([^:]*):([^,]*)),([^,]*),([^,]*);[ 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...
-
-
sztanozs
veterán
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;
[ 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...
-
drkbl
őstag
válasz tototos #4879 üzenetére
Van olyan konstruktora, ahol megadható a kultúrafüggő formázás.
-
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.
[ Szerkesztve ]
“All nothings are not equal.”
-
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.
[ Szerkesztve ]
“All nothings are not equal.”
-
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 #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.
“All nothings are not equal.”
-
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.
[ Szerkesztve ]
“All nothings are not equal.”
-
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 -
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á.
-
kingabo
őstag
válasz tototos #6579 üzenetére
A batch file ki tudja saját magát törölni úgy látom: stackoverflow
-
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.
[ Szerkesztve ]
“All nothings are not equal.”
-
Ú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!
- iPad topik
- ThinkPad (NEM IdeaPad)
- Kerékpárosok, bringások ide!
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
- Tarr Kft. kábeltv, internet, telefon
- A fociról könnyedén, egy baráti társaságban
- Nikon DSLR topik
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Íme az Assassin's Creed Shadows első előzetese
- Huawei Watch Fit 3 - zöldalma
- További aktív témák...
- Crucial T500 PRO 2 TB M.2 NVME PCI-E 4.0 x4 - Új, Bontatlan, Hűtőbordás - 7400-7000 MBs - Eladó!
- Samsung Galaxy S21+ 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- Eladó Ipad 9. Generáció 64 GB Wifi Silver
- Apple iPhone 13 Pro Max 128GB, Kártyafüggetlen, 1 Év Garanciával
- ASUS ROG STRIX RTX 2080 SUPER - eladó!
- MSI B75MA-P33 alaplap + i5-2310 processzor eladó. /Beszámítás/
- Lenovo S1La40
- Akció! Új! LENOVO THINKPAD UNIVERSAL USB-C DOCK
- Bomba Ár! Lenovo ThinkPad W541 - i7-4700MQ I 16GB I 128SSD I K1100 I 15,6" FHD I Cam I W10 I Gari!
- Bomba ár! Lenovo ThinkPad T430 - i7-G3 I 8GB I 240GB SSD I Nvidia I 14" HD+ I Cam I W10 I Garancia!
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs