Linux ubuntu18.04.4下如何利用CPU利用率画出50%直线、正弦曲线、心形曲线
记录一下,经过了各种失败以后,本菜鸡在一步步的尝试中终于成功画出了曲线。整理一下,我经历的最主要问题如下(我用的VirtualBox):
在终端执行后显示“无效的参数”且无法显示曲线。据说有的人可能是内存分配的太小而导致的,解决方法是增加分配的内存。而我的问题是虚拟机只分配了一个内核,也就是打开系统监视器会发现只出现了一个核。
我的解决过程如下:
1.在VirtualBox管理器界面更改我的虚拟机设置。
然而我第一次修改并没有改成功,原因是我以前安装的时候糊里糊涂的然后给内存给了系统检测的最大值8G,修改处理器数量时窗口下方会一直提示信息,于是就减少分配的内存大小,增加核的个数。
2.后来发现我给的磁盘容量也不够,所幸后来重新装了一个虚拟机,分配的内存大小5G,内核4个,磁盘容量50G。(重新安装及分配后也就彻底解决了这一系列问题)
cpu使用率曲线代码(代码是直接引用的)
50%直线和正弦曲线的代码:
/*** cpu曲线.c 代码片段 ***/
#define __USE_GNU
#define _GNU_SOURCE
#include <pthread.h>
#include <gtk/gtk.h>
#include <unistd.h>
#include <stdlib.h>
#include <gdk/gdkkeysyms.h>
#include <cairo.h>
#include <sys/time.h>
#include <time.h>
#include <sched.h>
#include <sys/types.h>
typedef long long int int64;
struct point
{
gint x;
gint y;
}point_sin[20],point_pre_sin[40];
GtkWidget* window;
static GThread* thr_line = NULL; //线程变量,执行CPU50%的任务
static GThread* thr_sin = NULL; //线程变量,执行CPU正弦曲线的任务
static GMutex * lock = NULL; //锁变量
static GCond* note_line = NULL; //条件变量,以实现条件互斥
static GCond* note_sin = NULL;
//static GCond* note_draw = NULL;
gboolean is_line_start = FALSE;
gboolean is_sin_start = FALSE;
gboolean is_line_draw = FALSE; //draw 50% line
gboolean is_sin_draw = FALSE; //draw sin curve
int counter = 0;
int line_x[40];
void init();
static gboolean on_exposed_event(GtkWidget* widget,
gpointer data);
void on_btn_line(GtkButton* button,gpointer data);
void on_btn_sin(GtkButton* button,gpointer data);
unsigned long GetTickCount();
void process_line();
void process_sin();
/*主程序*/
int main(int ac,char* av[])
{
if(!g_thread_supported())
{
g_thread_init(NULL);
}
gdk_threads_init();
gtk_init(&ac,&av);
gdk_threads_enter ();
cpu_set_t set_main;
CPU_ZERO(&set_main);
CPU_SET(0, &set_main);
CPU_CLR(1, &set_main);
if( (sched_setaffinity(0, sizeof(cpu_set_t), &set_main)) == -1)
{
perror("sched_se");
}
if (!lock)
lock = g_mutex_new ();
if (!note_line)
note_line = g_cond_new ();
if (!note_sin)
note_sin = g_cond_new ();
// if (!note_draw)
//note_draw = g_cond_new ();
init();
gtk_main();
g_mutex_free(lock);
g_cond_free(note_line);
g_cond_free(note_sin);
//g_cond_free(note_draw);
gdk_threads_leave ();
return 0;
}
/*初始化*/
void init()
{
GtkWidget* hbox;
GtkWidget* fixed1;
GtkWidget* fixed2;
GtkWidget* btn_line;
GtkWidget* btn_sin;
//设置主窗体
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"destroy",
G_CALLBACK(gtk_main_quit),NULL);
gtk_window_set_title(GTK_WINDOW(window),"CPU利用率曲线");
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_resizable(GTK_WINDOW(window),FALSE);
gtk_container_set_border_width(GTK_CONTAINER(window),50);
gtk_widget_set_size_request(window,550,300);
//设置盒子构建
hbox = gtk_hbox_new (FALSE, 5); //容器内控件是否大小一致 控件之间的间隔
gtk_container_add(GTK_CONTAINER(window),hbox