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