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