C语言 为什么在调用计时器的函数中,参数有其他值



我有这段代码:

int gui_createButtonStart(struct GameGUI **gameGUI)
{
    .
    .
    .
    g_signal_connect(G_OBJECT((*gameGUI)->buttonStart), "clicked",
                     G_CALLBACK(gui_clickStart), gameGUI);
    return 0;
}
int gui_deleteGameGUI(struct GameGUI **gameGUI)
{
    if (gameGUI == NULL || *gameGUI == NULL)
        return POINTER_NULL;
    free(*gameGUI);
    *gameGUI = NULL;
    return 0;
}
int gui_closeWhistGame(GtkWidget *windowTable, struct GameGUI **gameGUI)
{
    if (windowTable == NULL)
        return POINTER_NULL;
    gui_deleteGameGUI(gameGUI);
    gtk_widget_destroy(windowTable);
    gtk_main_quit();
    return FUNCTION_NO_ERROR;
}
int gui_clickStart(GtkWidget *button, struct GameGUI **gameGUI)
{
    if (gameGUI == NULL)
        return POINTER_NULL;
    if (*gameGUI == NULL)
        return POINTER_NULL;
    if ((*gameGUI)->game == NULL)
        return GAME_NULL;
    gtk_widget_hide(button);
    gui_startRound(gameGUI);
    return FUNCTION_NO_ERROR;
}
int gui_startRound(struct GameGUI **gameGUI)
{
    gui_startTime(gameGUI);
    return 0;
}
int gui_startTime(struct GameGUI **gameGUI)
{
    if (gameGUI == NULL)
        return POINTER_NULL;
    if (*gameGUI == NULL)
        return POINTER_NULL;
    if ((*gameGUI)->limitTimeGUI == NULL)
        return POINTER_NULL;
    guint interval = (1000 * LIMIT_TIME) / LENGTH_TIME_LINE;
    g_timeout_add(interval, (GSourceFunc)gui_timer, (gpointer)gameGUI);
    return FUNCTION_NO_ERROR;
}
gboolean gui_timer(gpointer data)
{
    struct GameGUI *gameGUI = *((struct GameGUI**)data);
    if (gameGUI == NULL)
        return FALSE;
}
int main(int argc, char *argv[])
{
    struct GameGUI *gameGUI = gui_createGameGUI();
    GtkWidget *window;
    .
    .
    .
    g_signal_connect(G_OBJECT(window), "destroy",
                     G_CALLBACK(gui_closeWhistGame), &gameGUI);
    gtk_main();
    return 0;
}

这段代码取自我的一个项目。当我运行代码时,屏幕上出现一个按钮。当我按下他被称为gui_clickStart()并启动计时器。当我按下"x"时,窗口将关闭(但我有多个打开的窗口),*gameGUI将收到NULL。问题是在计时器*gameGUI中并不总是NULL,有时是NULL,有时不是NULL。为什么?

您应该在窗口关闭时杀死超时

g_timeout_add返回一个guint32,它是源ID。您可以使用它来删除gui_deleteGameGUI函数中的超时。就像

int gui_deleteGameGUI(struct GameGUI **gameGUI)
{
    if (gameGUI == NULL || *gameGUI == NULL)
        return POINTER_NULL;
    g_source_remove((*gameGUI)->gameTimer);
    (*gameGUI)->gameTimer = 0;
    free(*gameGUI);
    *gameGUI = NULL;
    return 0;
}

假设您将它像这样存储在gui_startTime函数中。

guint interval = (1000 * LIMIT_TIME) / LENGTH_TIME_LINE;
(*gameGUI)->gameTimer = g_timeout_add(interval, (GSourceFunc)gui_timer, (gpointer)gameGUI);

最新更新