- Milyen egeret válasszak?
- Házimozi haladó szinten
- Apple asztali gépek
- AMD Navi Radeon™ RX 9xxx sorozat
- Fejhallgató erősítő és DAC topik
- Steam Deck
- Rendkívül ütőképesnek tűnik az újragondolt Apple tv
- Samsung Galaxy Tab S11 - tizenegyes
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Szünetmentes tápegységek (UPS)
Új hozzászólás Aktív témák
-
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();
}
} -
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.
Ú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!
- Debrecen és környéke adok-veszek-beszélgetek
- Milyen egeret válasszak?
- Luck Dragon: Asszociációs játék. :)
- sziku69: Fűzzük össze a szavakat :)
- Házimozi haladó szinten
- Apple asztali gépek
- Vicces képek
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- AMD Navi Radeon™ RX 9xxx sorozat
- PlayStation 5
- További aktív témák...
- !Akció! Klipsch R-120SW Sub / Mélynyomó
- BMW gyári alufelni, téli gumival
- Eladó LG OLED G4 55" 3 ÉV GARANCIA
- iPad Air 5th gen (2022) 11" Blue M1 Cellular, ESR Rebound Hybrid Case 360 tok, 5in1 Type-C Hub
- AKCIÓ!!! Új SONOS ACE - Dolby Atmos vezetéknélküli fejhallgató, dupla BT, Sonos rendszer nélkül is m
- AKCIÓ! Lenovo Thinkpad T14 Gen 5 üzleti - Ultra 7 165U 16GB DDR5 512GB SSD Intel Graphics WIN11
- DDR5 8/ 16/ 32GB 4800-5600MHz SODIMM laptop RAM, több db- számla, garancia
- Garmin fenix 2
- BLUESUMMERS NVMe SSD adapter
- MSI Pulse 17 FHD IPS 144Hz i7-13700H 5.0Ghz 14mag 16GB 1TB Nvidia RTX 4060 8GB 140W Win11 Garancia
Állásajánlatok
Cég: NetGo.hu Kft.
Város: Gödöllő
Cég: Laptopműhely Bt.
Város: Budapest