Hirdetés
- Olcsó vs. drága egér: melyiknél érzed meg igazán a különbséget?
- Itt a Microsoft szörnyprocesszora, ami 132 maggal tarolhatja le a felhőt
- Az Inteltől – nem csak az Intelnek
- Alice Recoque-kal mutatná meg Európa hogyan kell szuperszámítógépet építeni
- Pokolian jól elrejtette egyik leghasznosabb hardverét az Intel
- DUNE médialejátszók topicja
- Hobby elektronika
- E-book olvasók
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Olcsó vs. drága egér: melyiknél érzed meg igazán a különbséget?
- Milyen monitort vegyek?
- Soundbar, soundplate, hangprojektor
- Számos VGA kihalhat a memóriapánik miatt
- SD memóriakártyák (SD, SDHC, SDXC, micro SD)
- Az Inteltől – nem csak az Intelnek
Új hozzászólás Aktív témák
-
joysefke
veterán
válasz
t-shirt
#9050
üzenetére
Van egy "DB Browser for SQLite" nevű kis stand alone programocska, azzal tudsz belenézni a táblákba és módosítani őket.
Ha programból akarod lekérdezni az SQLite adatbázist, akkor Entity Framework Core-hoz van SQLite provider. Neten fogsz találni a kapcsolódáshoz/használathoz példákat.
Én anno mikor kb egy éve használtam SQLite-ot, azért voltak limitációi: Mindenféle dátumkezeléssel nagyon megszenvedtem.
-
Keem1
veterán
válasz
t-shirt
#9050
üzenetére
Ez kell neked
Standalone DLL, annyi, hogy verzió- és architektúra érzékeny. Muszáj vagy x32 vagy x64-ben fordítanod és vele a megfelelő DLL-t "csomagolni". Mindenképp a nuget package-t használd, mivel az egy nagyobb dll és nincs prerequisite.Emellett használhatsz helper classt is, de ha ráérzel a lényegre, akkor az adott class-ben úgyis megoldod a használatát. Én mindig készítek egy model classt, és szinte csak ott használom az adatbáziskezelést. így a helper már nem nyújt előnyt.
-
Zalanius
tag
válasz
t-shirt
#8699
üzenetére
A ciklusban, a létrehozott példányoknál célszerű elvégezni még az eseménykezelő hozzárendelését, valahogy így:
rdo.CheckedChanged += new System.EventHandler(this.Altalad_Felirt_Metodus);Aztán az eseménykezelőben a sender objectről feltételezzük, hogy RadioButton:
RadioButton rb = (RadioButton)sender;
// stb.De lehet külön típusvizsgálatot is tartani egy is segítségével, ha éppen szükséges.
-
dqdb
nagyúr
válasz
t-shirt
#8662
üzenetére
Ez esetben elég ennyi módosítás, és nem fogja a CPU-t tekerni feleslegesen:
using (var port = new SerialPort("COM" + cp))
{
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DataReceived += Port_DataReceived;
port.Open();
while (fo_tomb_index <= (fo_tomb_merete-1))
{
receivedNewRequest.WaitOne();
var s = port.ReadExisting();
WriteData(port, fo_tomb[fo_tomb_index]);
Console.WriteLine(fo_tomb[fo_tomb_index]);
fo_tomb_index++;
}
}
}
private static WaitHandle receivedNewRequest = new AutoResetEvent(false);
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
receivedNewRequest.Set();
}joysefke: a kódodnál nem azért nem fogja feleslegesen terhelni a CPU-t, mert áttetted a futását egy másik szálra, hanem azért nem, mert a példádban a SerialPort.ReadLine hívást használod, ami ReadTimeout időt vár, mielőtt visszatérne, ha nincsen adat, és közben értelmes módon várakozik.
-
joysefke
veterán
válasz
t-shirt
#8656
üzenetére
Igen, az idő nagyobbik részében üresen pörög, okozhat ez gondot?
Az oprendszer nem tudja eldönteni, hogy egy programszál azért pörög maxon mert nem csinál semmit azon kívül, hogy egy üres ciklusban van, vagy azért mert tényleges dolga van. Pár ilyennel le lehet terhelni a gépet.Konzolos program esetében megoldható hogy várakozzon az eseményre anélkül hogy lefutna (kilépne)? Lásd pld. fent. ott a main thread bevárja a másikat mielőtt kilépne. Ha a main thread előbb végezne, akkor annak a kilépése a többi threadet is befejezné (konzol applikációban).
-
joysefke
veterán
válasz
t-shirt
#8654
üzenetére
Én úgy értettem a dolgot, hogy a gép kezdi az üzenetváltást, és a PC szemszögéből mindig
fogadás-írás-fogadás-írás stb a sorrend. Itt a PC a szerver és ha ezt a feladatot kiszervezed egy külön threadbe akkor nyugodtan lehet blokkolni azt a threadet a munkagépre történő várakozással. Persze ahogy fölöttem írták, nem ártana ide sem egy timeout...Ha blokkoló olvasással oldod meg a dolgot, akkor valahogy így nézhet ki a dolog.
(sosem volt serial portal dolgom és ezt amit válaszoltam sem tudom futtatni)Indítasz egy threadet amely minden munkacikus elején ellenőrzi, hogy szabad-e tovább futnia, ha nem, akkor rendezetten kilép. Olvas-ír-olvas-ír amíg el nem fogynak a fo_tomb-ből a parancsok.
A main() -thread nincsen blokkolva egészen a
serverThread.Join()-ig Ennél a pontnál bevárja a serverThread-et. ha a main()-en belül a serverThread befejezte előtt beállítod aserverAllowedToRun=false-ot, akkor az leállítja a soros-port threadjét.class Program
{
// dummy data
private static string[] fo_tomb = Enumerable.Range(0, 100).Select(x => "Machine command nr: " + x.ToString()).ToArray();
private static bool serverAllowedToRun = true;
public static void ComServer()
{
using (var port = new SerialPort("COM4"))
{
// ezek menjenek fgv-paraméterbe
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.Open();
int n = fo_tomb.Length;
int i = 0;
while (serverAllowedToRun)
{
if (i >= n) break;
// ez a te 'mentes_valtozo' -d
// a PC olvasással kezd
// ez blokkol ameddig gép nem küld valamit amit a PC tud olvasni.
// nem pörgeti a gépet
string machineMessage = port.ReadLine();
// Ha a gép küldött üzenetet, akkor válaszolunk rá
port.WriteLine(fo_tomb[i]);
i++;
}
}
}
static void Main()
{
Thread serverThread = new Thread(ComServer);
// Érdemes lehet timeoutot megadni
// pld 10 perc: TimeSpan.FromMinutes(10);
serverThread.Join();
}
} -
dqdb
nagyúr
válasz
t-shirt
#8656
üzenetére
Ha a kommunikációban a PC a kliens és az eszköz a szerver, ami a kérésekre válaszol, akkor érdemes egy megfelelő timeout értéket választani és beállítani, amin belül a túloldalnak biztosan válaszolni kell, a DataReceived esemény kezelésére nincsen szükség, és a Read metódussal kiolvasni a választ, ez vár a timeoutnak megfelelő időt, ha nem kap választ. A válasz olvasásának módján a protokolltól függően lehet finomítani (fejléc van-e, kiderül-e előre, mekkora lesz az üzenet és hasonlók).
Ha a kommunikációban a PC a szerver és az eszköz a kliens, aminek a kéréseire válaszol a PC, akkor célszerű lenne a DataReceived eseményben egy AutoResetEvent példányt élesíteni Set metódussal, a fő ciklusban pedig WaitOne hívással várakozni rá, és ott kiolvasni a kapott adatot. Így nem pörögne 100%-on egy mag feleslegesen várakozás közben.
-
joysefke
veterán
válasz
t-shirt
#8654
üzenetére
Amikor a
mentes_valtozo == nullakkor a main thread üresben pörög, teljes sebességgel. És nyilván ez a "normál" állapot, mert mind a soros port, mind a munkagép sebessége elmarad a processzorétól.Másrészt a mentes_valtozo statikus. Ha két thread is hozzáfér, akkor a hozzáféréseket szinkronizálni kell.
-
dqdb
nagyúr
válasz
t-shirt
#8650
üzenetére
A soros port egy olyan állatfajta, amit egyszerre csak egy példányban lehet megnyitni, ráadásul full duplex átvitelre képes, így azon az egy példányon keresztül mehet a küldés-fogadás.
Emellett érdemes rászokni a
usinghasználatára olyan esetben, amikorIDisposableinterfészt megvalósító osztállyal dolgozol, mint aSerialPort, hogy exception esetében is garantáltan meghívódjon aDisposemetódus.Vakon belemódosítva valami ilyesmi lenne:
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (var port = new SerialPort("COM4"))
{
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DataReceived += Port_DataReceived;
port.Open();
Console.WriteLine("Küldj üzenetet a COM4 portra:");
while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)) {
WriteData(port, Console.ReadLine());
}
}
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
string dataReceived = sp.ReadExisting();
Console.WriteLine("A vissza jövö uzenet a COM4 port ra: " + dataReceived);
}
}
}
Ú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!
- Xiaomi Pad 5 6/128 GB
- Szép! Lenovo Thinkpad T14 G3 Golyóálló Üzleti Érintős Laptop 14" -50% i5-1250P 12Mag 16GB/512GB FHD+
- MSI GF66 gamer laptop - i7-11800H, RTX 3070, 32GB RAM, 1TB SSD, Win11
- UHH! Lenovo Yoga 9i x360 Érintős Hajtogatós Laptop Tab 14" -60% i7-1280P 16/1TB Iris Xe 4K UHD OLED
- Lenovo Miix 520 i5-8250U / 8 GB RAM / 256 GB / Windows 11 / EU bill
- Huawei P30 Lite / 4/128GB / Kártyafüggetlen / 12Hó Garancia
- Bomba ár! Dell Latitude 5491 - i7-8850H I 16GB I 512GB SSD I 14" FHD I HDMI I Cam I W10 I Gari!
- BESZÁMÍTÁS! Gigabyte B650 R7 7700 32GB DDR5 1TB SSD RTX 4070 Ti 12GB Asus TUF Gaming GT 501 750W
- Samsung Galaxy A16 / 4/128GB / Kártyafüggetlen / 12Hó Garancia / BONTATLAN NULL Perces
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB RAM RTX 5060Ti 16GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest



