0

スレッドでのプログラミングとロックの使用は初めてです。2つのスレッドがあります。1つはCOMポートからvlauesを読み取り、もう1つはステッピングモーターを制御します。

1つのスレッドで

        if stepperb_value != 0: #if stepperb non-zero
            if stepperb_value > 0: # if positive value
                self.step_fine(10,11,12,13,step_delay) #step forward
            else:
                self.step_fine(13,12,11,10,step_delay) #step backwards
            if abs(stepperb_value) != 100:
                time.sleep(10*step_delay*((100/abs(stepperb_value))-1))                       

(stepperbを変更すると、最後の行でゼロ除算エラーが発生するのを防ぐ必要があります)

COMポートから値を読み取る他のスレッドで

            if 'stepperb' in dataraw:
                outputall_pos = dataraw.find('stepperb')
                sensor_value = dataraw[(1+outputall_pos+len('stepperb')):].split()
                print "stepperb" , sensor_value[0]
                if isNumeric(sensor_value[0]):
                    stepperb_value =  int(max(-100,min(100,int(sensor_value[0]))))

どこで(そしてどのような種類のロックが)必要ですか?最初のスレッドは時間に敏感なので、優先する必要があります

よろしく

サイモン

4

3 に答える 3

2

さて、あなたの重要な変数はstepperb_value、それが「保護」されるべきものです:

すべての同期の問題 (消費者/生産者パターン) を処理する Queue を使用することをお勧めします。また、イベントと条件も適切なソリューションになる可能性があります。

http://www.laurentluce.com/posts/python-threads-synchronization-locks-rlocks-semaphores-conditions-events-and-queues/

于 2013-02-02T11:01:36.337 に答える
2

stepperb_value一連のアクセスが変更されないことが予想される場合、一連のアクセスをロックする必要があります。あなたの場合、それは投稿したモーター制御ブロック全体になります。同様に、COM ポート スレッドへの割り当て全体をロックしstepperb_valueて、書き込みがアトミックであり、最初のスレッドがロックを保持している間は書き込みが行われないようにする必要があります (値が変更されないことを期待します)。

于 2013-02-02T10:51:20.110 に答える