Кто-нибудь знает что-нибудь об ошибках сегментации с потоковыми логическими переменными?

#python #multithreading #matplotlib #segmentation-fault #boolean

Вопрос:

Я создаю симулятор двойного маятника с резьбовым вводом, где пользователь может вводить данные под разными углами и длиной, а аниматор matplotlib может отображать их в режиме реального времени. Сейчас я пытаюсь найти способ закрыть эту пользовательскую анимацию, когда пользователь так скажет, что позволит программе рассчитать траекторию пути и создать вторую анимацию, чтобы показать ее в течение 20 секунд. Моя проблема в том, что, когда я пытаюсь закрыть первый график, я получаю ошибку ошибки сегментации без каких-либо других подробностей. Я новичок в Python и на данный момент действительно в тупике.

Моя текущая идея заключалась в том, что, поскольку я делился глобальными значениями угла и длины между потоком и изображением запроса, я инициализировал бы логическую переменную в потоке, и когда пользователь вводит ее, она переключает эту переменную на «True». Затем функция animate имеет условие, при котором, если она считывает эту глобальную переменную как истинную, она закрывает график. Вот сама нить:

 
initstr = """
                    Symplectic Double Pendulum Simulator

Please enter the bob masses, pendulum lengths, and starting angles in degrees as
such:

ANGLE1 ANGLE2 M1 M2 L1 L2

Or enter just starting angles (other values defaulted to 1):

ANGLE1 ANGLE2

When you are satisfied with your pendulum, type <Run>.
"""
print(initstr)

def inputthread():
    global m1
    m1 = 1.0
    global m2
    m2 = 1.0
    global l1
    l1 = 1.0
    global l2
    l2 = 1.0
    global a0
    a0 = np.pi/2
    global b0
    b0 = np.pi
    global anistart # Sends signal to begin animation
    anistart = None
    while True:
        instr = input('Pendulum Parameters: ')
        if instr.upper() == 'RUN':
            anistart = False
            break
        try:
            instrlist = instr.split(' ')
            nlist = [float(x) for x in instrlist]
            a = len(nlist)
            if a == 6:
                a0 = (nlist[0]/360)*2*np.pi # Convert to radians
                b0 = (nlist[1]/360)*2*np.pi
                m1 = nlist[2]
                m2 = nlist[3]
                l1 = nlist[4]
                l2 = nlist[5]
            if a == 2:
                a0 = (nlist[0]/360)*2*np.pi
                b0 = (nlist[1]/360)*2*np.pi
                print(m1, m2, l1, l2, a0, b0)
            if a != 2 and a != 6:
                raise IndexError
        except ValueError:
            print('nInvalid input, try againn',file=sys.stderr)
        except IndexError:
            print('nInvalid number of inputs, try againn',file=sys.stderr)


 

А вот функция обновления анимации:

 def update1(i):
    x1i = l1*np.sin(a0)
    y1i = -l1*np.cos(a0)

    x2i = l2*np.sin(b0)   x1i
    y2i = -l2*np.cos(b0)   y1i
        
    xgi = [0, x1i, x2i]
    ygi = [0, y1i, y2i]
    
    line.set_data(xgi, ygi)
        
    axlim = l1   l2   1
    ax.set_xlim(-axlim,axlim)
    ax.set_ylim(-axlim,axlim)
    if anistart == False:
        plt.close()
    return line,

 

Я могу опубликовать всю программу, если понадобится, я просто уверен, что ошибка сегментации связана с тем, как функция обновления специально считывает логическое значение. Если я выну anistart предложение и позволю запустить приглашение, то все будет работать идеально, поэтому я знаю, что поток правильно взаимодействует с этой функцией. Кто-нибудь знает достаточно об ошибках сегментации и потоках, чтобы помочь мне?