#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
предложение и позволю запустить приглашение, то все будет работать идеально, поэтому я знаю, что поток правильно взаимодействует с этой функцией. Кто-нибудь знает достаточно об ошибках сегментации и потоках, чтобы помочь мне?