使用sync.Map替换map
This commit is contained in:
parent
f734a897fd
commit
788c40131f
20
main.go
20
main.go
|
|
@ -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!")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue