synchronizace   otázka

C#, Threading, I/O operace

Mám winform aplikaci, která čte/zapisuje data z/do sériovky.

Jak správně synchronizovat přístup k členům SendData a ReceivedData?

ve Form1:

CommunicationClass Komunikace = new CommunicationClass(); 
Komunikace.SendData.val1 = 3; 
byte temp = Komunikace.ReceivedData.cislo1; 

public class CommunicationClass 
{ 
public struct DataSendStruct 
{ 
public byte val1; // bude hodne clenu 
} 
public struct DataRecvStruct 
{ 
public byte cislo1; // bude hodne clenu 
} 

private SerialPort Port = new SerialPort(); 
private EventWaitHandle DataCompleted = new AutoResetEvent(false); 
public DataSendStruct SendData; 
public DataRecvStruct ReceivedData; 

public CommunicationClass() 
{ 
Port.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived); 
new Thread(SendingData).Start(); 
} 

private void SendingData() 
{ 
while (true) 
{ 
byte[] buffer = new byte[10]; 
buffer[0] = SendData.val1;// prevod dat do bufferu 
Port.Write(buffer, 0, buffer.Length); // poslat 
DataCompleted.WaitOne(); // cekat 
} 
} 

private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
byte[] buffer = new byte[Port.BytesToRead]; 
Port.Read(buffer, 0, buffer.Length);//nacist dostupna data 
// if (data jsou vsechna nebo komunikacni problem) ... 
DataCompleted.Set(); // signalizace, ze je vse nacteno 
ReceivedData.cislo1 = buffer[0]; // prevod dat do promennych 
} 
} 
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pomocí lock nebo ReaderWriterLockSlim pokud je potřeba větší granularita.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To tak nějak tuším, ale co nevím, co zamykat...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Samozřejmě tu metodu, která se volá z více vláken.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback