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 - 语句未按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

在 foreach 循环中死亡时未按良好顺序执行的行

Firebase 查询未按正确顺序执行?

NodeJS HTTP请求未按顺序执行

ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift

AWS Device Farm上的Appium测试未按指定顺序执行

Hive SQL语句执行顺序