当我运行自己的简单GTK应用程序时,CPU负载非常高
使用,我已经用线程构建了GTK3应用程序。它很好用。但它使用了大约90%的CPU负载。你能告诉我这个问题的原因吗?即使我把睡眠时间从100毫秒增加到1秒,这也无济于事 代码如下:当我运行自己的简单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
//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);
}