線程A:運行在主界面,可以進入管理界面,進行日常的操作,
比如說登記用戶,導入導出用戶,產生驗證記錄!恢復出廠設置!
線程B:運行一個socket客戶端任務,
1.將A線程產生的數據上傳至服務器!
2.接受并處理來自服務端的命令/請求!,如,設置用戶,清除數據,清除驗證記錄等.
典型的思路,在處理用戶數據的時候,就用Mutex鎖就可以!
在這里嘗試用兩個volatile變量處理,處理各種狀態機!
volatile bool bDeviceBusy = false; //設備是否忙!
volatile bool bInManagerMenu = false; //是否在管理菜單中
void SetDeviceBusy(bool bBusy);
void SetInManagerMenu(bool bBusy);
場景1:
1.線程B如要設置用戶數據,可以先鎖定設備SetDeviceBusy(true),視情況可考慮并sleep(n)一下.
2.線程A在主界面的循環中,判斷bDeviceBusy的值,如果為true,則在主界面上顯示"工作中...",并且鎖定設備,不能進入其他任何操作!
3.線程B設置用戶數據完成之后,調用SetDeviceBusy(false),
4.線程A在主界面的循環中,判斷bDeviceBusy的值,如果為false,解鎖設備,使設備正常工作!
場景2:
1.線程A進入了管理菜單,進行用戶數據的設置,如,恢復出廠設置時,可以先SetInManagerMenu(true)
2.線程B在線程的循環中,判斷bInManagerMenu的值,如果為true,則不處理大部分的事務,如果有網絡命令,直接應答設備忙.
3.線程A操作完成之后,調用SetInManagerMenu(false),
4.線程B在線程的循環中,判斷bInManagerMenu的值,如果為false,繼續處理來自服務端的命令/請求!
優化方案:
通過一個變量的狀態來實現.
//volatile int device_status = -1;