- Mobilinternet EU-n kívül, eSIM adatcsomagok használata
- iPhone topik
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Honor 200 Pro - mobilportré
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Díjnyertes okosgyűrű érkezik júliusban
- Motorola Edge 40 neo - színre és formára
- Motorola Moto Tag - nyomom, követ
- Telekom mobilszolgáltatások
Ú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 == null
akkor 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
using
használatára olyan esetben, amikorIDisposable
interfészt megvalósító osztállyal dolgozol, mint aSerialPort
, hogy exception esetében is garantáltan meghívódjon aDispose
metó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
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- Le Mans Ultimate
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- Bambu Lab 3D nyomtatók
- Autós topik látogatók beszélgetős, offolós topikja
- alza vélemények - tapasztalatok
- Mobilinternet EU-n kívül, eSIM adatcsomagok használata
- sziku69: Szólánc.
- EAFC 25
- További aktív témák...
- Nitro AN515-56 15.6" FHD IPS i7-11370H RTX 3050 16GB 512GB NVMe magyar vbill gar
- HP Pavilion 15-ec2057ur 15.6" FHD IPS Ryzen 7 5800H RTX 3050 16GB 512GB magyarított vbill gar
- AKCIÓ!!! GAMER PC: Új i5-14400F +RTX 5070 +Új 16-32GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ!
- Corsair RM750
- Apple watch Ultra 2 black edt 2027.11.07 Apple jótállás+ Apple Care +
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5800X 16/32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- AKCIÓ! Gigabyte H510M i5 10400F 16GB DDR4 512GB SSD GTX 1070 8GB Rampage SHIVA Zalman 600W
- Napi 700 ft tól elvihető RÉSZLETRE BANKMENTES HP 840 G11 Ultra 5
- Jogtiszta Microsoft Windows / Office / Stb.
- Beszámítás! Apple Watch SE 2024 44mm Cellular okosóra garanciával hibátlan működéssel
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest