2010-12-14 3 views
1

Я кодирую настольную игру в Qt, где после того, как игрок совершит движение, компьютер AI должен приостановить и подумать некоторое время. Однако, хотя он и думает, кажется, что экран не будет обновляться до тех пор, пока не будет выполнена каждая строка кода. Таким образом, пользователь будет щелкать по квадрату, не вижу ничего в течение нескольких секунд, а затем вдруг увидит результат как его перемещения , так и.Задание Qt GUI для обновления

Чтобы исправить это, я попытался создать новый поток, на котором ИИ запускает свой код, а затем помещает его часть на доску. Однако иногда (и это очень противоречиво) игра вылетает после того, как компьютер сделал ход.

Так вы, ребята, как:

  1. Скажите мне, как заставить MainWindow обновить его содержимое
  2. Помогите мне попробовать отладить эту проблему, разбивающихся (я совершенно новой для потоков)

EDIT - Я попытался установить контрольные точки, как предположил сузертерпатт, и программа, похоже, последовательно разбивается на отладчик (это было не раньше, чем я установил точки останова).

В любом случае, как я пошагово программы, кажется, идет через run функции штрафа, пока он не достигнет окончания скобу, а затем, если я шаг через него прыгает в линии 317 на qthread_win.cpp, который просто говорит

finish(arg); //line 317 
return 0; 

Если я пройду через эту линию, отладчик замерзает, и Qt предупреждает меня через 20 секунд. Если я продолжу, я получаю сообщение «Это приложение запросило Runtime, чтобы прекратить его необычным способом», которое я получаю, когда программа иногда сбой, когда я не отлаживаю.

Что мне теперь делать?

+0

Вы должны придерживаться создания отдельного потока ИИ. Отладка не должна быть слишком сложной только с двумя потоками, особенно если вы уже знаете, где происходят сбои: вы, возможно, можете просто сломать некоторые точки останова и посмотреть, какой из них нужно выполнить последним, а затем сузить его оттуда. – suszterpatt

+0

@susz все в порядке, но я не слишком уверен, где происходят сбои. Переход к настройкам точки google в qt ... – wrongusername

ответ

5

Причиной аварии может быть множество причин, но если бы я должен был предположить, я бы сказал, что вы, вероятно, называете методы объекта GUI (ярлык, текстовое поле, игровое поле и т. Д.) Из поток ИИ.

Способы взаимодействия потоков друг с другом в Qt осуществляется через механизм, называемый signals and slots: поток AI должен выставлять набор сигналов, то есть «beginThink», «endThink», а поток пользовательского интерфейса должен регистрироваться на этих сигналах (с слоты) и реагировать соответственно. Это хорошо документировано в документах.

+0

Ах, так что я должен отбросить указатели на функции, которые я сейчас использую, и вместо этого переключиться на использование сигналов и слотов? – wrongusername

+0

@wrong: Абсолютно. Qt делает несколько вещей правильно IMO, но сигналы и слоты определенно являются одним из них. – suszterpatt

+0

Хотя у меня нет ничего в потоке AI, который вызывает какой-либо материал GUI, я вижу 'QPainter :: begin: устройство для рисования можно нарисовать только одним художником за раз. QPainter :: setBrush: Painter not active' и 'QPainter :: drawRects: Painter not active' повторно перед сбоем. – wrongusername

0

Попробуйте переместить код из отдельной темы. После того, как вы его заработаете, вы можете попробовать переместить его, и вы узнаете, какие проблемы связаны с потоками. Я думаю, что ваша проблема с обновлением исчезнет, ​​если все будет в одном потоке.

+0

Код работает нормально, если я вызываю метод 'run' напрямую, а не запускает поток с' start'. Я уверен, что это связано с потоками, но что вы хотите быть «все в одном потоке»? – wrongusername

Смежные вопросы