我有这段代码:
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。为什么?
答案 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);