首页 > 解决方案 > OSError:异常:访问冲突读取 0x00007FFB1F945B50(随机发生)

问题描述

我正在使用 python、ctypes 在测量设置中与 National Instrument DAQ 对话。我有时(有时是)收到错误:OSError:异常:访问冲突读取 0x00007FFB1F945B50(每次发生错误时,代码 0x00007FFB1F945B50 都是不同的)。我的操作系统是 Windows 10,Python 是 3.4。“有时”是指大多数情况下我们的测量工作正常,但使用相同的设置,每 40 次出现上述错误。在第一步中,我对如何重现此错误以及了解其起源的性质很感兴趣。哪些情况会导致有时仅使用相同的设置才会出现此错误。

Python Traceback 的相关部分是:

  File "modulum.py", line 5422, in updateLaserIntensity
    outthread = daqio.Output("Dev1/ao0", np.ones(10)*intensity_in_volts, 1e3, -10.0, 10.0) # setting channel ao1 of DAQ to given value
  File "D:\development\codebase\daqio.py", line 209, in __init__
    None))
OSError: exception: access violation reading 0x00007FFB1F945B50

daqio.Output 类的代码是

class Output( threading.Thread ):
    def __init__( self, target, waveform, sampleRate, Uoutmin, Uoutmax):
        self.running = True
        self.sampleRate = sampleRate
        self.periodLength = len( waveform )
        # target = 'Dev1/ao0' # obsolete, used as argument of init now
        target = target.encode('ascii')
        self.OUT = TaskHandle( 0 )
        self.data = np.zeros( ( self.periodLength, ), dtype=np.float64 )
        # convert waveform to a np array
        for i in range( self.periodLength ):
            self.data[ i ] = waveform[ i ]
        # setup the DAQ hardware
        try:
            CHK(nidaq.DAQmxCreateTask("",
                            ctypes.byref( self.OUT )))
            # global threadedTask
            # threadedTask = self.OUT
            # print('Output task is:', threadedTask)
            print('')
        except:
            pass
            print('Output Task creation failed, current task pointer is:', runningTask)   

        CHK(nidaq.DAQmxCreateAOVoltageChan( self.OUT,
                        target,
                        "",
                        float64(Uoutmin),
                        float64(Uoutmax),
                        DAQmx_Val_Volts,
                        None))

        CHK(nidaq.DAQmxCfgSampClkTiming( self.OUT,
                        "",
                        float64(self.sampleRate),
                        DAQmx_Val_Rising,
                        DAQmx_Val_ContSamps,
                        uInt64(self.periodLength)))

        CHK(nidaq.DAQmxWriteAnalogF64( self.OUT,
                        int32(self.periodLength),
                        0,
                        float64(-1),
                        DAQmx_Val_GroupByChannel,
                        self.data.ctypes.data,
                        None,
                        None))

        threading.Thread.__init__( self )
        self.runningThread = True

    def run( self ):
        # try: 
            # if self.runningThread == True:
        CHK(nidaq.DAQmxStartTask( self.OUT ))

    def stop( self ):
        CHK(nidaq.DAQmxStopTask( self.OUT ))
        CHK(nidaq.DAQmxClearTask( self.OUT ))
        global threadedTask
        threadedTask = TaskHandle( 0 )

nidaq 是 DAQ 的 DLL。

nidaq = ctypes.windll.LoadLibrary('nicaiu.dll')

由于这是一个很难解决的错误,因为它是统计上发生的,所以我非常想在这个问题上提供一些帮助。

标签: pythonmultithreadingctypes

解决方案


推荐阅读