Бесконечный цикл -> Нужно показать основной экран с помощью Qt - PullRequest
0 голосов
/ 29 февраля 2012

вот я снова!Итак, я разрабатываю эмулятор GBC на C ++, но у меня есть некоторые проблемы.Прежде всего, я использую Qt в VS10, который пока работает хорошо.Но у меня есть GUI (главное окно) с несколькими объектами (QListWidget, Buttons и т. Д.).Итак, в моем классе CPU у меня есть цикл, который эмулирует все инструкции GBC.Это работает просто.Получить код, декодировать, получить и вызвать операцию в коммутаторе, сделать все заново.Итак, моя проблема заключается в том, что в каждом случае я хотел бы, чтобы этот главный экран отображался с обновленным списком.

Изображение ниже, я не могу опубликовать, потому что у меня нет 10 точек повторения.http://i.stack.imgur.com/BdaHo.png

Итак, кусок кода, чтобы вы могли (попробовать?) Понять, что происходит: (cpu.cpp)

next:
op = FETCH;
setSelection((UINT32)op);
ciclos = cycles_table[op];

switch(op)
{
       do the magic
       emit onEndProcess((UINT32)op);
       goto next;
}

cpu.h

signals:
void onEndProcess(UINT32);

который получен ratagbc (ratagbc.h)

public slots:
        void receivedEndProcess(UINT32);

И реализован:

void RataGBC::receivedEndProcess(UINT32 i){
    this->ui.listWidget->item(i+1)->setSelected(true);
    this->show();
 }

И в конструкторе rata после ui.setupUI (...)У меня есть:

cpp = new cpu();
    connect(cpp,SIGNAL(onEndProcess(UINT32)),this,SLOT(receivedEndProcess(UINT32)));

}

Где cpp - это экземпляр класса процессора.Здесь есть проблема, это соединение возвращает false !!

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
RataGBC w;
dasm dsm;
FILE *file = fopen("Tetris DX.gbc","r");
int c = 0;
while(dsm.DAsm(file,w.ui.listWidget,c));
fclose(file);
w.cpp->start();
w.show();
return a.exec();
}

Одна вещь, которую я заметил, это то, что мне нужно реализовать (пустой) onEndProcess в моем cpu.cpp, или это дает мне ошибку компоновки,Это действительно необходимо?

Надеюсь, вы, ребята, можете понять, что мне нужно!Спасибо!

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Используйте QTimer с таймаутом 0 для выполнения ожидания) вовремя.Т.е. выполнить один шаг вашей эмулируемой программы.Или несколько шагов, но не все.Запустите таймер для запуска эмулируемой программы.
Как только вы закончите, позвоните QCoreApplication::exit();.

Если вы не понимаете, как сделать QObject / использовать таймеры, прочитайте руководства по Qt.

1 голос
/ 29 февраля 2012

a.exec() запускает цикл обработки событий, который включает обновление графического интерфейса. Поместите соответствующие шаги в функцию и используйте систему событий Qt для выполнения кода.

И не используйте goto.

0 голосов
/ 01 марта 2012

Вы пытаетесь запустить два «бесконечных цикла» в одном потоке.Одним из них является ваш цикл процессора, который, очевидно, блокирует.Другой - это цикл событий Qt, который будет блокироваться до тех пор, пока вы не закроете приложение.

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

Вместо этого вы должны запустить ЦП в отдельном потоке и обмениваться данными с потоком GUI, используя слоты в очереди и другие многопоточные конструкции, такие как QMutex , QAtomicInt и QAtomicPointer .

Ниже описано, как я бы это реализовал (вы, очевидно, должны адаптировать его):

GUI Thread

Здесь вы запускаете QApplication::exec().

  • Создайте главное окно (со списком и поверхностью рисования)
  • Запустите поток ЦП
  • Всякий раз, когда происходит событие ввода, сигнализируйте об изменении в потоке ЦП
  • Всякий раз, когда поток ЦП обновляет видеобуфер, обновляет поверхность рисования
  • Когда пользователь завершает работу, останавливает нить ЦП

CPU Thread

Реализация нового QThread для выполнения следующих действий.

  • Извлечение, декодирование, выполнение
  • Чтение ввода при каждом его обновлении
  • Запись видеопамяти и уведомление об этом.Поток графического интерфейса для обновления поверхности рисования
  • Выйти, когда сказано.

Помните, только поток графического интерфейса может манипулировать такими виджетами пользовательского интерфейса, как списки и меню.Поток ЦП должен использовать механизмы, такие как помещенные в очередь слоты, чтобы сообщить потоку графического интерфейса об обновлении виджетов.

Еще один совет: посмотрите на , как другие люди решали ту же проблему .

...