Принудительное обновление графического интерфейса Qt - PullRequest
1 голос
/ 14 декабря 2010

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

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

Так что вы, ребята, тоже можете:

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

РЕДАКТИРОВАТЬ - Я попытался установить точки останова, как предложил suszterpatt, и программа, похоже, постоянно зависала в отладчике (это не было до того, как я установил точки останова).

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 14 декабря 2010

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

Потоки взаимодействуют друг с другом в Qt через механизм, называемый сигналами и слотами : поток AI должен предоставлять набор сигналов, то есть 'beginThink', 'endThink' и поток пользовательского интерфейса следует зарегистрироваться на эти сигналы (со слотами) и реагировать соответственно. Это довольно подробно описано в документации.

0 голосов
/ 14 декабря 2010

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

...