C - Заявления не выполняются по порядку - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующий код, который я пытаюсь запустить, однако wait_for_connection(), кажется, выполняется перед предыдущими 2 строками, и я не могу понять, почему? Мне действительно нужно запустить две предыдущие строки перед вызовом функции wait_for_connection(). Даже если я введу sleep(1) перед вызовом функции wait_for_connection(), она все равно будет запущена перед предыдущими строками.

Мой код выглядит следующим образом:

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 раз.

Кто-нибудь знает, что может происходить? Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

3 голосов
/ 20 апреля 2020

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

В вашем wait_for_connection у вас есть все oop который может повторяться до десяти раз, и каждую итерацию вы будете делать sleep(1), которая спит целую секунду. Пока этот l oop повторяется и спит, обработка событий не произойдет, и, как уже упоминалось, это создаст впечатление, что ваш пользовательский интерфейс не отвечает и ничего не делает.

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

...