C - 语句未按顺序执行
Posted
技术标签:
【中文标题】C - 语句未按顺序执行【英文标题】:C - Statements not executing in order 【发布时间】:2020-04-19 20:49:56 【问题描述】:我尝试运行以下代码,但是 wait_for_connection()
似乎在前两行之前运行,我似乎不明白为什么?我真的需要在调用wait_for_connection()
函数之前运行前两行。即使我在调用wait_for_connection()
函数之前输入了sleep(1)
,它仍然会在前面几行之前运行。
我的代码如下:
void wait_for_connection()
for (int i = 0; i < 10; i++)
g_print("Checking server...\n");
if (connected == 1)
g_print("Connected to: %s", selectedServerStr);
break;
sleep(1);
int connect_server(GtkButton *button, gpointer user_data)
.......
if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selectedServer), &model, &iter))
path = gtk_tree_model_get_path(model, &iter);
serverIndex = *gtk_tree_path_get_indices(path);
g_print("Selected Server IP: %s\n", serverIPArray[serverIndex][0]);
gtk_widget_set_sensitive(serverList, FALSE); // These 2 lines needs to be run first
append_to_log("Attemping connection, please wait...", 1);
wait_for_connection(); // This is where the error lies, this runs before the above 2 lines
return 1;
else
gtk_widget_set_name(serverBox, "fieldsError");
g_print("No server selected: Aborting...\n");
return -1;
gtk_widget_set_sensitive()
行用于禁用选择小部件的用户交互,但这似乎直到wait_for_connection()
函数完成打印“检查服务器...”10 次后才会发生。 connected
的值为 0,所以目前该函数只打印“正在检查服务器...”10 次。
有人知道会发生什么吗?任何帮助将不胜感激,谢谢。
【问题讨论】:
假设没有线程,代码正在按顺序执行。 (即使有线程,每个线程也按顺序执行。) 您如何检测到wait_for_connection
调用发生在“以上两行”之前?通过检查输出?通过在调试器中单步执行您的代码?如果您检查输出,并且输出被写入stdout
(使用例如printf
),请记住默认情况下它是 line buffered 并且在缓冲区已满或你打印一个换行符。因此,要么使用调试器查看 真正 发生了什么,要么在输出中添加一些尾随换行符。
@Someprogrammerdude 因此,gtk_widget_set_sensitive()
行用于禁用 GUI 中的小部件,直到 wait_for_connection()
函数完成打印后才会发生这种情况,它是 10 "Checking server..."行,然后显然g_print
语句出现在其后
关于:if (connected == 1)
connected
设置在哪里?
@user3629249 connected
设置在文件的开头,设置为值 1 仅用于测试
【参考方案1】:
几乎所有平台上的 GUI 应用程序都是事件驱动的。他们需要定期执行事件处理函数,否则用户界面会显得无响应,甚至看起来像是被锁定或什么都没有发生。
在您的wait_for_connection
中,您有一个最多可以迭代十次的循环,每次迭代您都会执行sleep(1)
,它会休眠一整秒。虽然此循环正在迭代和休眠,但不会发生事件处理,并且如前所述,这会使您的用户界面看起来像没有响应并且什么都不做。
您还需要将代码修改为事件驱动,因此“连接”状态将作为您可以处理的事件发送,或者以某种方式使轮询异步,使其与事件处理并行发生.
【讨论】:
感谢您的回复。我尝试使用单独的线程来运行wait_for_connection
函数,这允许程序按预期运行,但是我需要原始函数不再继续,并等待wait_for_connection
函数的结果,并且正在努力实现这一目标,而不会再次出现原来的问题......我很抱歉,我对 C 和 GTK 还很陌生,所以我仍在努力解决这一切
这是一个状态机。如果您需要代码 x 等待耗时的代码 y 完成,则 x 必须是另一个由 y 发出的事件/信号/消息运行的事件处理程序。您不能在 GUI 事件处理程序中等待。以上是关于C - 语句未按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章
ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift