为什么在调用定时器的函数中,参数具有其他值?

时间:2014-08-22 09:59:21

标签: c timer gtk

我有这段代码:

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。为什么?

1 个答案:

答案 0 :(得分:1)

窗口关闭时应该终止超时。

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);