Multithreading in GTK

xiaoxiao2021-03-06  59

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`

转载请注明原文地址:https://www.9cbs.com/read-90312.html

New Post(0)