I just started learning GTK programming, and I met many problems in the middle, and I recorded the solution.
I hope more exchanges
1. Add a multi-threaded support library, first make Clean clear; will then put the configure.in file
PKG_CHECK_MODULES (GTK, GTK -2.0 GDK-2.0, EXIT) is changed
PKG_CHECK_MODULES (GTK, GTK -2.0 GDK-2.0 GTHREAD-2.0, EXIT)
2. Or use manually compile, the command is as follows
GCC -O Thread Thread.c `pkg-config --cflags - Libs GTK -2.0 GTHREAD-2.0`
3. Sample code
#include
Static gtkwidget * fixed;
Static gtkwidget * button1;
Static gtkwidget * button2;
Void Our_Thread1 (gtkwidget * button)
{
Gint X, Y, Towards;
X = 40;
y = 40;
Towards = 1;
For (;;)
{
g_usleep (4);
GDK_THREADS_ENTER ();
GTK_FIXED_MOVE (GTK_FIXED (Fixed), Button, X, Y);
Switch (Towards)
{
Case 1:
X = x 10;
IF (x == 25) Towards = 2;
Break;
Case 2:
Y = y 10;
IF (y == 250) Towards = 3;
Break;
Case 3:
X = X-10;
IF (x == 40) Towards = 4;
Break;
Case 4:
Y = Y-10;
IF (y == 40) Towards = 5;
}
GDK_THREADS_LEVE ();
}
}
Void Our_thread2 (gtkwidget * button)
{
Gint i, J, Forward;
i = 40;
J = 40;
FORWARD = 1;
For (;;)
{
g_usleep (1);
GDK_THREADS_ENTER ();
GTK_FIXED_MOVE (GTK_FIXED (Fixed), Button, i, j);
Switch (Forward)
{
Case 1:
i = i 10;
IF (i == 290) forward = 2;
Break;
Case 2:
J = J 10;
IF (j == 250) forward = 3;
Break;
Case 3:
i = I-10;
IF (i == 40) forward = 4;
Break;
Case 4:
J = J-10;
IF (j == 40) forward = 5;
}
GDK_THREADS_LEVE ();
}
}
Void on_begin (gtkwidget * button, gpointer data)
{
GTK_WIDGET_SET_SENSITIVE (Button, False);
g_thread_create (Our_Thread1, Button1, False, NULL);
g_thread_create (ou_thread2, button2, false, null);
}
Int main (int Argc, char * argv [])
{
Gtkwidget * window, * view;
Gtkwidget * vbox, * button, * label; if (! G_thread_supported ())
g_thread_init (null);
GDK_THREADS_INIT ();
GTK_INIT (& Argc, & Argv);
WINDOW = gtk_window_new (gtk_window_toplevel);
gtk_window_set_title (gtk_window (window), "thread APLINDOTION");
g_signal_connect (g_object (window), "delete_event",
G_callback (gtk_main_quit), NULL;
GTK_CONTAINER_SET_BORDER_WIDTH (GTK_CONTAINER (Window), 10);
Vbox = gtk_vbox_new (false, 0);
GTK_CONTAINER_ADD (GTK_CONTAINER (Window), VBOX);
Label = gtk_label_new ("Notice! Button is moving");
GTK_BOX_PACK_START (GTK_BOX (VBOX), Label, False, False, 0);
View = GTK_VIEWPORT_NEW (NULL, NULL);
GTK_BOX_PACK_START (GTK_BOX (VBOX), View, False, False, 0);
Fixed = gtk_fixed_new ();
GTK_WIDGET_SET_USIZE (Fixed, 330, 330);
GTK_CONTAINER_ADD (gtk_container (view), fixed);
Button1 = gtk_button_new_with_label ("1");
Button2 = gtk_button_new_with_label ("2");
GTK_FIXED_PUT (gtk_fixed (fixed), button1, 10, 10);
GTK_FIXED_PUT (gtk_fixed (fixed), button2, 40, 40);
Button = gtk_button_new_with_label ("st");
GTK_BOX_PACK_START (GTK_BOX (VBOX), Button, False, False, 5);
g_signal_connect (g_object (button), "clicked",
G_callback (on_begin), null;
GTK_WIDGET_SHOW_ALL (Window);
GDK_THREADS_ENTER ();
gtk_main ();
GDK_THREADS_LEVE ();
Return False;
}
// The compilation option is as follows:
// gcc -o thread thread.c `pkg-config --cflags --libs GTK -2.0 GTHREAD-2.0`