PyModuleCommModule.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import threading
  2. import time
  3. import modulecommpython
  4. import numpy as np
  5. import ctypes
  6. modulelock = threading.Lock()
  7. nThread = 0
  8. class PyModuleComm:
  9. def __init__(self,strname):
  10. # 初始化代码...
  11. checklib=ctypes.CDLL('./libchecklicence.so')
  12. a=checklib._ZN12Checklicence12CheckLinceseEv()
  13. if a != 1:
  14. exit(0)
  15. print("name: ",strname)
  16. self.strmemname = strname
  17. self.mbRegister = False
  18. global nThread
  19. nThread = nThread+1
  20. self.mnMode = 0
  21. print("nThread = ",nThread)
  22. self.obj = modulecommpython.get_ca_object()
  23. pass
  24. def RegisterRecv(self,call):
  25. if self.mbRegister:
  26. print(" Have register, can't register other.")
  27. return
  28. print("Register: ",self.strmemname)
  29. self.mpcall = call
  30. self.mbRegister = True
  31. self.mbRun = True
  32. self.mpthread = threading.Thread(target=self.threadrecvdata, args=(self.strmemname,))
  33. self.mpthread.start()
  34. print("complete create thread.")
  35. self.mnMode = 1
  36. self.obj.RegisterRecv(self.strmemname)
  37. def RegiseterSend(self,nSize,nPacCount):
  38. if self.mbRegister:
  39. print(" Have register, can't register other.")
  40. return
  41. print("Register: ",self.strmemname)
  42. self.mnsize = nSize
  43. self.mnPacCount = nPacCount
  44. self.mbRegister = True
  45. self.mnMode = 2
  46. self.obj.RegisterSend(self.strmemname,nSize,nPacCount)
  47. def SendData(self,arr,nsendsize):
  48. # nrealsize = np.zeros(1, dtype=np.int32)
  49. nrtn = self.obj.SendData(arr,nsendsize)
  50. def threadrecvdata(self, arg):
  51. # 这个函数将被线程执行
  52. # print(f"线程开始执行,参数是 {arg}")
  53. nBuffSize = int(1000)
  54. arr = np.zeros(nBuffSize,dtype=np.int8)
  55. recvtime = np.zeros(1,dtype=np.int64)
  56. nrealsize = np.zeros(1,dtype=np.int32)
  57. while 1:
  58. nrtn = self.obj.RecvData(arr,nBuffSize,nrealsize,recvtime)
  59. if nrtn > 0:
  60. self.mpcall(arr,nrtn,recvtime)
  61. else:
  62. pass
  63. if nrtn < 0:
  64. nBuffSize = int(nrealsize[0] * 2)
  65. arr = np.zeros(nBuffSize,dtype=np.int8)
  66. else:
  67. time.sleep(0.001)
  68. print("threadrecvdata complete.")
  69. def stop_thread(self):
  70. self.mbRun = False
  71. self.mpthread.join()
  72. def start_thread(self, arg):
  73. # 创建线程对象,target参数指向要在线程中运行的函数
  74. self.mbRun = True
  75. self.mpthread = threading.Thread(target=self.my_function, args=(arg,))
  76. # 启动线程
  77. self.mpthread.start()
  78. # 可以在这里添加其他代码,主线程会继续执行
  79. print("主线程继续执行...")
  80. # 如果需要等待线程结束,可以调用 join() 方法
  81. # thread.join()