当我运行自己的简单GTK应用程序时,CPU负载非常高

当我运行自己的简单GTK应用程序时,CPU负载非常高,c,gtk,cpu-load,C,Gtk,Cpu Load,使用,我已经用线程构建了GTK3应用程序。它很好用。但它使用了大约90%的CPU负载。你能告诉我这个问题的原因吗?即使我把睡眠时间从100毫秒增加到1秒,这也无济于事 代码如下: //gcc-ledgui.c`pkg-config--cflags gtk+-3.0 pkg-config--libs gtk+-3.0` //当您运行此代码时,它将有非常高的CPU负载。 //您可以在此处找到此代码的固定版本: // https://stackoverflow.com/questions/6401

使用,我已经用线程构建了GTK3应用程序。它很好用。但它使用了大约90%的CPU负载。你能告诉我这个问题的原因吗?即使我把睡眠时间从100毫秒增加到1秒,这也无济于事

代码如下:

//gcc-ledgui.c`pkg-config--cflags gtk+-3.0 pkg-config--libs gtk+-3.0`
//当您运行此代码时,它将有非常高的CPU负载。
//您可以在此处找到此代码的固定版本:
//   https://stackoverflow.com/questions/64019411/very-high-cpu-load-when-i-run-my-own-simple-gtk-application
#包括
#包括
#包括
#定义LED_颜色_红色0
#定义LED_颜色_绿色1
#定义LED_颜色_黄色2
#定义LED_颜色_关闭3
#定义LED_颜色_计数4
字符*颜色[]={“红色”、“绿色”、“黄色”、“黑色”};
GtkWidget*LED灯;
GMutex互斥体;
gchar-ledText[256];
void*ledstask1(void*vargp);
void*LedTask2(void*vargp);
void-LedGuiThread();
void SetFontColors(GtkWidget*grid);
gboolean updateLabel(gpointer数据);
无效任务睡眠时间(整数毫秒);
void SetTextColor(char*fcolor);
int main()
{ 
pthread_t thread_id;
pthread_t thread_id2;
ledGuitThread();
pthread_create(&thread_id2,NULL,ledstask1,NULL);
pthread_create(&thread_id,NULL,ledstask2,NULL);
gtk_main();
//pthread_join(thread_id2,NULL);
//pthread_join(thread_id,NULL);
出口(0);
}
void*LedTask1(void*vargp)
{
而(1)
{
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色\红色]);
g_idle_add(更新标签、LED灯);
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色]关闭];
g_idle_add(更新标签、LED灯);
}
}
void*LedTask2(void*vargp)
{
而(1)
{
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色\绿色]);
g_idle_add(更新标签、LED灯);
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色]关闭];
g_idle_add(更新标签、LED灯);
}
}
void LedGuiThread()
{
GtkWidget*窗口;
GtkWidget*网格;
GtkWidget*LED标签;
int argc=0;
字符**argv=NULL;
gtk_init(&argc,&argv);
//声明
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置标题(gtk_窗口(窗口),“LED”);
grid=gtk_grid_new();
SetFontColor(网格);
LED标签=gtk_标签_新(“1”);
LED灯=gtk_标签_新(“O”);
//设置属性
gtk_容器设置_边框宽度(gtk_容器(窗口),20);
gtk_小部件设置大小请求(gtk_小部件(窗口),200,50);
gtk网格设置行间距(gtk网格(网格),4);
gtk_网格设置_柱间距(gtk_网格(网格),4);
gtk_容器添加(gtk_容器(窗口),网格);
//用屎填充网格(x,y,h,v)
gtk_格栅附接(gtk_格栅(格栅),LED标签,2,2,2,1);
gtk_格栅连接(gtk_格栅(格栅),LED灯,2,3,2,1);
gtk_小部件_全部显示(窗口);
g_信号连接(g_对象(窗口),“销毁”,g_回调(gtk_主退出),NULL);
}
void setFontColor(GtkWidget*网格)
{
GtkCssProvider*供应商;
GtkStyleContext*上下文;
/*在整个小部件中更改默认字体和颜色*/
provider=gtk_css_provider_new();
gtk_css_提供程序_从_数据加载_(提供程序,
"* {"
颜色:白色
“背景色:黑色;”
“字体:20px单空格;”
"}",
-1,
无效);
context=gtk_widget_get_style_context(网格);
gtk_样式_上下文_添加_提供程序(上下文,
GTK_样式_提供程序(提供程序),
GTK_样式_提供程序_优先级_应用程序);
}
gboolean updateLabel(gpointer数据)
{
字符文本[256];
GtkLabel*led=数据;
g_互斥锁(和互斥锁);
strncpy(text,ledText,sizeof(text));
g_mutex_unlock(&mutex);
gtk_标签_设置_标记(gtk_标签(led),文本);
}
无效任务睡眠时间(整数毫秒)
{
//printf(“睡眠%d毫秒\n”,毫秒);
usleep(ms*1000);
}
void SetTextColor(char*fcolor)
{
g_互斥锁(和互斥锁);
snprintf(ledText,256,“O”,fcolor);
g_mutex_unlock(&mutex);
}

谢谢Dan,我刚刚添加了
return FALSE位于
updateLabel
函数的末尾。它现在使用的CPU负载不到1%

// gcc ledgui.c `pkg-config --cflags gtk+-3.0 pkg-config --libs gtk+-3.0`

#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>

#define LED_COLOR_RED       0
#define LED_COLOR_GREEN     1
#define LED_COLOR_YELLOW    2
#define LED_COLOR_OFF       3
#define LED_COLOR_COUNT     4

char *color[] = {"red", "green", "yellow", "black"};
GtkWidget *ledLight;
GMutex mutex;
gchar ledText[256];

void *LedTask1 (void *vargp);
void *LedTask2 (void *vargp);
void LedGuiThread ();
void SetFontColors(GtkWidget *grid);
gboolean updateLabel(gpointer data);
void Task_sleep_ms(int ms);
void SetTextColor(char* fcolor);

int main() 
{ 
    pthread_t thread_id; 
    pthread_t thread_id2; 

    LedGuiThread();
    pthread_create(&thread_id2, NULL, LedTask1, NULL); 
    pthread_create(&thread_id, NULL, LedTask2, NULL);

    gtk_main();
    // pthread_join(thread_id2, NULL); 
    // pthread_join(thread_id, NULL); 
    exit(0); 
}

void *LedTask1 (void *vargp)
{
    while (1)
    {
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_RED]);
        g_idle_add(updateLabel, ledLight);
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_OFF]);
        g_idle_add(updateLabel, ledLight);
    }
}

void *LedTask2 (void *vargp)
{
    while (1)
    {
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_GREEN]);
        g_idle_add(updateLabel, ledLight);
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_OFF]);
        g_idle_add(updateLabel, ledLight);
    }
}

void LedGuiThread()
{
    GtkWidget *window;
    GtkWidget *grid;
    GtkWidget *ledLabel;
    int argc=0;
    char **argv=NULL;
    gtk_init (&argc,&argv);

    //Declarations
    window    = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "LED");
    grid      = gtk_grid_new ();

    SetFontColors(grid);

    ledLabel  = gtk_label_new ("1");
    ledLight  = gtk_label_new ("O");

    //Set Properties
    gtk_container_set_border_width (GTK_CONTAINER(window), 20);
    gtk_widget_set_size_request    (GTK_WIDGET(window), 200, 50);
    gtk_grid_set_row_spacing       (GTK_GRID(grid), 4);
    gtk_grid_set_column_spacing    (GTK_GRID(grid), 4);
    gtk_container_add              (GTK_CONTAINER(window), grid);

    //Fill the grid with shit                  (x, y, h, v)
    gtk_grid_attach (GTK_GRID(grid), ledLabel,       2, 2, 2, 1);
    gtk_grid_attach (GTK_GRID(grid), ledLight,       2, 3, 2, 1);

    gtk_widget_show_all (window);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
}

void SetFontColors(GtkWidget *grid)
{
    GtkCssProvider *provider;
    GtkStyleContext *context;

    /* Change default font and color throughout the widget */
    provider = gtk_css_provider_new();
    gtk_css_provider_load_from_data(provider,
                                    "* {"
                                    " color: white;"
                                    " background-color: black;"
                                    " font: 20px monospace;"
                                    "}",
                                    -1,
                                    NULL);

    context = gtk_widget_get_style_context(grid);
    gtk_style_context_add_provider(context,
                                   GTK_STYLE_PROVIDER(provider),
                                   GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

}

gboolean updateLabel(gpointer data)
{
    char text[256];
    GtkLabel *led = data;
    g_mutex_lock (&mutex);
    strncpy(text, ledText, sizeof(text));
    g_mutex_unlock (&mutex);
    gtk_label_set_markup (GTK_LABEL (led), text);

    //  If the function returns FALSE 
    // it is automatically removed from the list 
    // of event sources and will not be called again.
    return FALSE; 
}

void Task_sleep_ms(int ms)
{
    // printf("sleep %d ms\n", ms);
    usleep(ms * 1000);
}

void SetTextColor(char* fcolor)
{
    g_mutex_lock(&mutex);
    snprintf(ledText, 256, "<span background=\"black\" foreground=\"%s\">O</span>", fcolor);
    g_mutex_unlock(&mutex);
}
//gcc-ledgui.c`pkg-config--cflags gtk+-3.0 pkg-config--libs gtk+-3.0`
#包括
#包括
#包括
#定义LED_颜色_红色0
#定义LED_颜色_绿色1
#定义LED_颜色_黄色2
#定义LED_颜色_关闭3
#定义LED_颜色_计数4
字符*颜色[]={“红色”、“绿色”、“黄色”、“黑色”};
GtkWidget*LED灯;
GMutex互斥体;
gchar-ledText[256];
void*ledstask1(void*vargp);
void*LedTask2(void*vargp);
void-LedGuiThread();
void SetFontColors(GtkWidget*grid);
gboolean updateLabel(gpointer数据);
无效任务睡眠时间(整数毫秒);
void SetTextColor(char*fcolor);
int main()
{ 
pthread_t thread_id;
pthread_t thread_id2;
ledGuitThread();
pthread_create(&thread_id2,NULL,ledstask1,NULL);
pthread_create(&thread_id,NULL,ledstask2,NULL);
gtk_main();
//pthread_join(thread_id2,NULL);
//pthread_join(thread_id,NULL);
出口(0);
}
void*LedTask1(void*vargp)
{
而(1)
{
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色\红色]);
g_idle_add(更新标签、LED灯);
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色]关闭];
g_idle_add(更新标签、LED灯);
}
}
void*LedTask2(void*vargp)
{
而(1)
{
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色\绿色]);
g_idle_add(更新标签、LED灯);
任务睡眠时间(100);
SetTextColor(颜色[发光二极管颜色]关闭];
g_idle_add(更新标签、LED灯);
}
}
无效线程
// gcc ledgui.c `pkg-config --cflags gtk+-3.0 pkg-config --libs gtk+-3.0`

#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h>

#define LED_COLOR_RED       0
#define LED_COLOR_GREEN     1
#define LED_COLOR_YELLOW    2
#define LED_COLOR_OFF       3
#define LED_COLOR_COUNT     4

char *color[] = {"red", "green", "yellow", "black"};
GtkWidget *ledLight;
GMutex mutex;
gchar ledText[256];

void *LedTask1 (void *vargp);
void *LedTask2 (void *vargp);
void LedGuiThread ();
void SetFontColors(GtkWidget *grid);
gboolean updateLabel(gpointer data);
void Task_sleep_ms(int ms);
void SetTextColor(char* fcolor);

int main() 
{ 
    pthread_t thread_id; 
    pthread_t thread_id2; 

    LedGuiThread();
    pthread_create(&thread_id2, NULL, LedTask1, NULL); 
    pthread_create(&thread_id, NULL, LedTask2, NULL);

    gtk_main();
    // pthread_join(thread_id2, NULL); 
    // pthread_join(thread_id, NULL); 
    exit(0); 
}

void *LedTask1 (void *vargp)
{
    while (1)
    {
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_RED]);
        g_idle_add(updateLabel, ledLight);
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_OFF]);
        g_idle_add(updateLabel, ledLight);
    }
}

void *LedTask2 (void *vargp)
{
    while (1)
    {
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_GREEN]);
        g_idle_add(updateLabel, ledLight);
        Task_sleep_ms(100);
        SetTextColor(color[LED_COLOR_OFF]);
        g_idle_add(updateLabel, ledLight);
    }
}

void LedGuiThread()
{
    GtkWidget *window;
    GtkWidget *grid;
    GtkWidget *ledLabel;
    int argc=0;
    char **argv=NULL;
    gtk_init (&argc,&argv);

    //Declarations
    window    = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "LED");
    grid      = gtk_grid_new ();

    SetFontColors(grid);

    ledLabel  = gtk_label_new ("1");
    ledLight  = gtk_label_new ("O");

    //Set Properties
    gtk_container_set_border_width (GTK_CONTAINER(window), 20);
    gtk_widget_set_size_request    (GTK_WIDGET(window), 200, 50);
    gtk_grid_set_row_spacing       (GTK_GRID(grid), 4);
    gtk_grid_set_column_spacing    (GTK_GRID(grid), 4);
    gtk_container_add              (GTK_CONTAINER(window), grid);

    //Fill the grid with shit                  (x, y, h, v)
    gtk_grid_attach (GTK_GRID(grid), ledLabel,       2, 2, 2, 1);
    gtk_grid_attach (GTK_GRID(grid), ledLight,       2, 3, 2, 1);

    gtk_widget_show_all (window);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
}

void SetFontColors(GtkWidget *grid)
{
    GtkCssProvider *provider;
    GtkStyleContext *context;

    /* Change default font and color throughout the widget */
    provider = gtk_css_provider_new();
    gtk_css_provider_load_from_data(provider,
                                    "* {"
                                    " color: white;"
                                    " background-color: black;"
                                    " font: 20px monospace;"
                                    "}",
                                    -1,
                                    NULL);

    context = gtk_widget_get_style_context(grid);
    gtk_style_context_add_provider(context,
                                   GTK_STYLE_PROVIDER(provider),
                                   GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

}

gboolean updateLabel(gpointer data)
{
    char text[256];
    GtkLabel *led = data;
    g_mutex_lock (&mutex);
    strncpy(text, ledText, sizeof(text));
    g_mutex_unlock (&mutex);
    gtk_label_set_markup (GTK_LABEL (led), text);

    //  If the function returns FALSE 
    // it is automatically removed from the list 
    // of event sources and will not be called again.
    return FALSE; 
}

void Task_sleep_ms(int ms)
{
    // printf("sleep %d ms\n", ms);
    usleep(ms * 1000);
}

void SetTextColor(char* fcolor)
{
    g_mutex_lock(&mutex);
    snprintf(ledText, 256, "<span background=\"black\" foreground=\"%s\">O</span>", fcolor);
    g_mutex_unlock(&mutex);
}