使用sync.Map替换map

This commit is contained in:
lijun 2025-01-15 00:25:10 +08:00
parent f734a897fd
commit 788c40131f
2 changed files with 49 additions and 22 deletions

20
main.go
View File

@ -63,9 +63,13 @@ func init() {
panic("failed to read config file:" + err.Error())
}
for _, device := range proto.Config.DeviceInfo {
service.DeviceRWMap[device.ID] = sync.RWMutex{}
service.DeviceCurrentFrameMap[device.ID] = gocv.NewMat()
service.DeviceIsGettingFrame[device.ID] = false
//service.DeviceRWMap[device.ID] = sync.RWMutex{}
//service.DeviceCurrentFrameMap[device.ID] = gocv.NewMat()
//service.DeviceIsGettingFrame[device.ID] = false
service.DeviceRWMap.Store(device.ID, &sync.RWMutex{})
service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat())
service.DeviceFrameCount.Store(device.ID, 0)
service.DeviceIsGettingFrame.Store(device.ID, false)
}
}
@ -83,7 +87,15 @@ func ReadConfigAndSetSystem() {
}
//检测是否需要获取设备流,如果需要则开启
for _, device := range proto.Config.DeviceInfo {
if service.DeviceIsGettingFrame[device.ID] == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启
is_get, ok := service.DeviceIsGettingFrame.Load(device.ID)
if !ok {
//说明没有这个设备,需初始化添加
service.DeviceRWMap.Store(device.ID, &sync.RWMutex{})
service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat())
service.DeviceFrameCount.Store(device.ID, 0)
service.DeviceIsGettingFrame.Store(device.ID, false)
}
if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启
go service.GetVideoStream(device.ID)
fmt.Println("device:", device.ID, " has started!")
}

View File

@ -14,35 +14,45 @@ import (
"time"
)
var DeviceRWMap = make(map[int]sync.RWMutex)
var DeviceCurrentFrameMap = make(map[int]gocv.Mat)
var DeviceFrameCount = make(map[int]int)
var DeviceIsGettingFrame = make(map[int]bool)
var DeviceRWMap = &sync.Map{}
var DeviceCurrentFrameMap = &sync.Map{}
var DeviceFrameCount = &sync.Map{}
var DeviceIsGettingFrame = &sync.Map{}
func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
//获取读写锁
mutex, ok := DeviceRWMap[device_id]
mutex_, ok := DeviceRWMap.Load(device_id)
if !ok {
return fmt.Errorf("设备:%s 读写锁不存在", device_id)
}
mutex := mutex_.(*sync.RWMutex)
mutex.Lock()
defer mutex.Unlock()
//设置当前帧
DeviceCurrentFrameMap[device_id] = frame
DeviceFrameCount[device_id]++
DeviceCurrentFrameMap.Store(device_id, frame)
frame_count, ok := DeviceFrameCount.Load(device_id)
if !ok {
return fmt.Errorf("设备:%s 当前帧计数不存在", device_id)
}
frame_count_ := frame_count.(int)
frame_count_++
DeviceFrameCount.Store(device_id, frame_count_)
return nil
}
func GetDeviceCurrentFrame(device_id int) (gocv.Mat, int) {
//获取读写锁
mutex, ok := DeviceRWMap[device_id]
mutex_, ok := DeviceRWMap.Load(device_id)
if !ok {
return gocv.NewMat(), -1
}
mutex := mutex_.(*sync.RWMutex)
mutex.RLock()
defer mutex.RUnlock()
//获取当前帧
return DeviceCurrentFrameMap[device_id], DeviceFrameCount[device_id]
frame, ok := DeviceCurrentFrameMap.Load(device_id)
frame_count, ok := DeviceFrameCount.Load(device_id)
return frame.(gocv.Mat), frame_count.(int)
}
func getVideoFrame(device proto.DeviceInfo) {
@ -86,9 +96,9 @@ func getVideoFrame(device proto.DeviceInfo) {
currentTime := time.Now().Format("2006-01-02 15:04:05")
gocv.PutText(&frame, currentTime, image.Point{10, 20}, font, fontScale, fontColor, lineType)
//需要将帧付给全局变量
err := SetDeviceCurrentFrame(frame, device.ID)
if err != nil {
fmt.Printf("设备:%s 错误: 无法设置当前帧\n", device)
err3 := SetDeviceCurrentFrame(frame, device.ID)
if err3 != nil {
fmt.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error())
}
z++
err2 := frame.Close()
@ -113,7 +123,12 @@ func Get(url string) int {
}
func GetVideoStream(id int) {
if DeviceIsGettingFrame[id] == true {
is_get, ok := DeviceIsGettingFrame.Load(id)
if !ok {
fmt.Println("device:", id, " not found")
return
}
if is_get == true {
fmt.Println("device:", id, " is running!")
return
}
@ -133,22 +148,22 @@ func GetVideoStream(id int) {
log.Println("device:", id, " not found")
break
}
if DeviceIsGettingFrame[id] == true {
is_get, ok = DeviceIsGettingFrame.Load(id)
if is_get == true {
log.Println("for device:", id, " is running!")
break
}
if device.NextStop {
DeviceIsGettingFrame[id] = false
DeviceIsGettingFrame.Store(id, false)
break
}
//设置设备控制信息
status := Get(device.Control)
DeviceIsGettingFrame[id] = true
DeviceIsGettingFrame.Store(id, true)
log.Println("device:", device.ID, " set control info status:", status)
getVideoFrame(device)
DeviceIsGettingFrame[id] = false //停止之后,设置已停止信息
DeviceIsGettingFrame.Store(id, false)
//等待1s
time.Sleep(1 * time.Second)
}