【发布时间】:2020-04-15 06:26:57
【问题描述】:
好吧,我可以暂停一下,问题是我所有的“暂停”都在累积,而不是按顺序完成。我尝试了很多时钟的东西,睡觉,..每次都得到相同的结果。我在这里错过了什么吗?我只是想通过视觉反馈帮助我编程,它不会留在代码中,所以任何东西,即使是肮脏的,都是受欢迎的!
void Dockable::resize_cells() {
for (int i = 0; i < cells.size(); i++) {
for (int j = 0; j < cells[i].size(); j++) {
if (cells[i][j] != layout) {
if (cells[i][j]->is.docked) {
int found_col = 0;
bool found = false;
int pos = 0;
for (int k = 0; k < cells.size(); k++) {
int col = 0;
for (int l = 0; l < cells[k].size(); l++) {
if (!found) {
if (cells[i][j] == cells[k][l]) {
found = true;
pos = col;
}
}
if (!(l - 1 < 0) &&
cells[k][l] != cells[k][l - 1]) {
col++;
}
else {
col++;
}
if (found) {
if (col > found_col) {
found_col = col;
}
}
}
}
cells[i][j]->x_size(layout->x_size() / found_col);
cells[i][j]->x((layout->x_size() / found_col) * pos);
cells[i][j]->refresh_shape_apply();
wait();
}
}
}
}
}
void Dockable::wait()
{
clock_t counter;
clock_t target;
counter = clock();
target = clock() + 100;
while (counter < target) {
counter = clock();
std::cout << counter << std::endl;
}
}
refresh_shape_apply,应用转换,因为它在等待之前执行,我希望它会起作用。
【问题讨论】:
-
积累是什么意思?你能写出你想要什么的描述吗?像,做一些事情。等待。做东西。等待。做东西。等待。做事。或做事。做东西。等待。做东西。做事。
-
好吧,Dockable 是我的菜,但我使用 sfml,所以是的,我想我发现了我的问题,在等待期间渲染循环可能也冻结了
-
大多数 GUI(实际上我所知道的)都是由某种事件循环驱动的。在这种情况下,应用程序的任何(重新)操作都应尽快返回到此事件循环(或在单独的线程中运行)。在代码中等待会阻止更新屏幕输出,因为更新也是通过事件循环调用来执行的。
-
解决方案是打破循环并使循环迭代变量成为某种“全局”状态。必须重新组织代码,以便完成一些迭代,直到例如已经消耗了一些时间,然后离开循环更新输出,然后重新进入循环进一步计算。
-
另一种解决方案可能是将事件循环处理的嵌套调用嵌入其中一个内部循环中。这确实适用于 Qt 和 GTK+,也可能适用于其他 GUI。但是,它可能不适用于您的情况。除此之外,(恕我直言)它不像上述方法那样简洁。
标签: c++ for-loop wait sleep pause