
DashBoardControlViewModel.cs는
DashBoardControl.xaml과 연동되어있고,
SensorMonitoringControlViewModel.cs는
SensorMonitoringControl.xaml과 연동되어있다.
SensorMonitoringControlViewModel.cs에 센서값을 1초마다 읽고 Sqlite DB에 저장하는 스레드가 있고,
DashBoardControlViewModel.cs에 저장된 센서값을 1초마다 읽어오고 DashBoardControl.xaml에 Binding된 프로퍼티에 저장하는 스레드가 있다.
그런데 계속 DB Lock 오류가 발생했다.
찾아보니 Sqlite는 동시 접근을 하면 안된다고 한다.
커넥팅 풀이라는 것을 사용하면 된다고 하는데 그만큼 복잡한 구조의 프로그램은 아니어서 순차접근을 하기로 했다.
기존 : DB 저장 스레드, DB 읽기 스레드가 같이 돌아가 DB에 동시 접근 문제 발생
변경 : DB 저장 스레드만 유지하고, DB 저장이 될 때마다 이벤트를 발생. DB 읽기 함수는 이벤트를 구독하여 이벤트가 발생하면 DB 읽기 실행.
SensorMonitoringControlViewModel.cs에 Bool 플래그 변수를 만들어서 DashBoardControlViewModel.cs에서 가져올까 했는데, 찾아보니 이벤트 구독을 위한 방식이 따로 존재하더라.
## SensorMonitoringControlViewModel.cs
public class SensorMonitoringControlViewModel : INotifyPropertyChanged
{
public event EventHandler DataInserted;
private void OnDataInserted()
{
DataInserted?.Invoke(this, EventArgs.Empty);
}
private void SaveSignalDbThread()
{
// DB insert 작업 수행
// DB insert 작업이 완료되었음을 알림
OnDataInserted();
}
}
## DashBoardControlViewModel.cs
public DashBoardControlViewModel(SensorMonitoringControlViewModel sensorMonitoringControlViewModel)
{
// 이벤트 핸들러 등록
_sensorMonitoringControlViewModel.DataInserted += SensorMonitoringViewModel_DataInserted;
}
// 이벤트 발생 시 실행할 함수
private void SensorMonitoringViewModel_DataInserted(object sender, EventArgs e)
{
}
SensorMonitoringControlViewModel에서 DataInserted라는 이벤트를 정의한다.
그리고 이 이벤트를 발생시키는 함수 OnDataInserted()를 만들었다.
DashBoardControlVIewModel에서는
SensorMonitoringViewModel의 DataInserted 이벤트에 대한 SensorMonitoringViewModel_DataInserted라는 핸들러를 등록했다.
핸들러 함수 안에는 DB저장 이벤트가 발생했을 때 해야하는 코드를(DB 읽기 및 프로퍼티 저장)을 넣었다.
실행해보니 DB에 저장한 다음 DB를 읽기 때문에 동시 접근으로 lock이 발생하는 오류가 사라졌다.
'개발 저장소 > 개발 지식 저장소' 카테고리의 다른 글
[Python] USB to RS485 시리얼통신(Hamilton Valve MVP-4와 PC 통신) (0) | 2023.09.22 |
---|---|
[CentOS] CentOS에 USB 연결하기 (마운트) (0) | 2023.08.02 |
[MySql] 윈도우 및 Mysql 재설치 후 기존 DB 복원하기(임시방편) (0) | 2023.07.06 |
[Windows10] 윈도우 설치 시 커맨드(CMD) 진입하기, Diskpart로 파티션 삭제하기 (0) | 2023.07.06 |
[C#, WPF] 이미지 파일을 불러와 Image 태그에 출력하기(MVVM 패턴) (0) | 2023.06.30 |