代码拉取完成,页面将自动刷新
//xlang Source, Name:memorywnd.xcsm
//Date: Thu Sep 17:49:58 2018
class XMemoryWnd : QDockWidget{
QTreeWidget _listview;
QPushButton btnGc, btnRefresh;
JsonObject meminfo;
Object memLock = new Object();
public static XMemoryWnd memoryWnd;
MemoryWaveWidget memwidget;
static const int COMPILE_INFO_NOTIFY = 2;
onTreeViewItemEvent listlistener = new onTreeViewItemEvent(){
};
Vector<long> memhistroy = new Vector<long>();
public static class MemoryWaveWidget : QWidget{
double []histroy = new double[100];
int currentidx = 0;
bool bupdated = false;
QPainter.Paint mempaint = new QPainter.Paint();
QPainter.Paint ptpaint = new QPainter.Paint();
QPainter.Paint txtpaint = new QPainter.Paint();
QPath _currentpath = nilptr;
double hmax = 0;
bool bpressed = false;
double pressx = 0;
int bkcolor = 0xfffefefe;
String tipsText = "";
double tipy;
public void onAttach()override{
mempaint.setStyle(QPainter.Paint.FILL_AND_STROKE);
mempaint.setColor(0x7f64d9f0);
ptpaint.setColor(0xffff0000);
ptpaint.setStyle(QPainter.Paint.STROKE);
txtpaint.setColor(0xff00ff00);
}
public QPath buildpath(double w, double h){
QPath mempath = new QPath();
mempath.moveto(0,h);
for (int i = 0; i < 100; i ++){
if (histroy[i] > hmax){
hmax = histroy[i];
}
}
double dp = w / 100;
double yp = h * 0.8f / hmax;
for (int i = 0; i < currentidx + 1; i ++){
mempath.lineto(dp * i,h - (yp * histroy[i]));
}
mempath.lineto(dp * (currentidx),h);
bupdated = false;
if (bpressed){
int id = pressx / dp;
if (id >=0 && id < currentidx + 1){
double ptmem = histroy[id];
tipy = h - (yp * histroy[id]);
tipsText = "快照" + (id + 1) + ":" + formatByte(ptmem);
}
}
return mempath;
}
public void onMouseMove(int Button,int x,int y,int flags,int source)override{
if (bpressed){
pressx = x;
bupdated = true;
update();
}
}
public void onMouseButtonRelease(int Button,int x,int y,int flags,int source)override{
bpressed = false;
bupdated = true;
update();
}
public void onMouseButtonPress(int Button,int x,int y,int flags,int source)override{
bpressed = true;
pressx = x;
bupdated = true;
update();
}
public void applySetting(){
if (Setting.isDarkStyle()){
bkcolor = 0xff252526;
txtpaint.setColor(0xffe0e0e0);
}else{
txtpaint.setColor(0xff252627);
bkcolor = 0xfffefefe;
}
}
public void onPaint(int l,int t,int r,int b,long hpaint)override{
QPainter painter = new QPainter(hpaint);
int w = width(), h = height();
painter.fillRect(0,0,w,h,bkcolor,QBrush.Style.SolidPattern);
painter.setPaint(mempaint);
QPath __cpath;
synchronized(this){
if (bupdated){
_currentpath = buildpath(w, h);
}
__cpath = _currentpath;
}
if (__cpath != nilptr){
painter.drawPath(__cpath);
}
if (bpressed){
painter.setPaint(ptpaint);
painter.drawLine(pressx,0,pressx,h);
painter.drawLine(0,tipy,w,tipy);
painter.drawText(tipsText,pressx,tipy, txtpaint);
}else{
painter.drawText("峰值:" + formatByte(hmax),5,15, txtpaint);
}
}
public void addMemhistroy(long value){
synchronized(this){
if (currentidx < 99){
currentidx++;
}else{
_system_.arrayCopy(histroy,1,histroy,0,99);
}
histroy[currentidx] = value;
bupdated = true;
}
}
public void reset(){
currentidx = 0;
}
};
public static void reconfig(){
memoryWnd.memwidget.applySetting();
}
public static void reset(){
memoryWnd.memwidget.reset();
}
public void onAttach(){
_listview = (QTreeWidget)attachByName(new QTreeWidget(), "memlist");
memwidget = (MemoryWaveWidget)attachByName(new MemoryWaveWidget(), "memwidget");
btnGc = (QPushButton)attachByName(new QPushButton(), "btnGc");
btnRefresh = (QPushButton)attachByName(new QPushButton(), "btnRefresh");
/*setOnLayoutEventListener(new onLayoutEventListener(){
void onResize(QObject obj, int w, int h, int oldw, int oldh)override {
if (_listview != nilptr){
_listview.resize(w, h - 60);
btnGc.move(0, h - 55);
btnRefresh.move(80, h - 55);
}else{
_system_.consoleWrite("XMemoryWnd listview no prepared");
}
}
});*/
btnGc.setOnClickListener(
new onClickListener(){
void onClick(QObject obj, bool checked)override{
XWorkspace.workspace.debuggee.requestGc();
}
});
btnRefresh.setOnClickListener(
new onClickListener(){
void onClick(QObject obj, bool checked)override{
XWorkspace.workspace.debuggee.queryMemory();
}
});
String [] columns = {"项目", "计数", "内存"};
_listview.setColumns(columns);
_listview.setColumnWidth(0, 100);
_listview.setColumnWidth(1, 50);
_listview.setColumnWidth(2, 200);
_listview.setOnTreeViewItemEvent(listlistener);
memoryWnd = this;
new Timer().schedule(
new TimerTask(){
void run(){
if (XWorkspace.workspace != nilptr){
XWorkspace.workspace.debuggee.queryMemory();
}
}
}, 1000, -1);
}
public void showInfo(JsonObject infos){
synchronized(memLock){
meminfo = infos;
this.Notify(COMPILE_INFO_NOTIFY);
}
}
public static String formatByte(long bytes){
if (bytes < 1024){
return "" + bytes + " Byte(s)";
}
if (bytes >= 1024 && bytes < (1024 * 512)){
return String.format("%.4f Kb", (bytes / 1024.f));
}
if (bytes >= (1024 * 512) && bytes < 1024 * 1024 * 1024){
return String.format("%.4f Mb", (bytes / 1048576.f));
}
return String.format("%.4f Gb", (bytes / (1048576.f * 1024.f)));
}
long getJsonLong(@NotNilptr JsonObject jroot, String name){
String str = jroot.getString(name);
if (str != nilptr){
return str.parseLong();
}
return 0;
}
public void onNotification(long id){
JsonObject _meminfo = nilptr;
synchronized(memLock){
_meminfo = meminfo;
_listview.clear();
if (_meminfo != nilptr){
long lc = _meminfo.getInt("lc");
long ls = _meminfo.getInt("ls");
long dc = _meminfo.getInt("dc");
long ds = _meminfo.getInt("ds");
long ac = _meminfo.getInt("ac");
long as = _meminfo.getInt("as");
long bc = _meminfo.getInt("bc");
long bs = _meminfo.getInt("bs");
long cc = _meminfo.getInt("cc");
long cs = _meminfo.getInt("cs");
long sc = _meminfo.getInt("sc");
long ss = _meminfo.getInt("ss");
long cxc = _meminfo.getInt("cxc");
long cxs = _meminfo.getInt("cxs");
long oc = _meminfo.getInt("oc");
long os = _meminfo.getInt("os");
long au = _meminfo.getInt("au");
long js = _meminfo.getInt("js");
long ts = _meminfo.getInt("ts");
long tc = _meminfo.getInt("tc");
long heap = 0;
long uheap = 0;
try{
heap = getJsonLong(_meminfo, "heap");
uheap = getJsonLong(_meminfo, "uheap");
}catch(Exception e){
}
long item = _listview.addItem(nilptr, "数组对象");
_listview.setItemText(item, 1, "" + ac);
_listview.setItemText(item, 2, formatByte(ac * as));
item = _listview.addItem(nilptr, "数组数据");
_listview.setItemText(item, 1, "" + au);
_listview.setItemText(item, 2, formatByte(au));
item = _listview.addItem(nilptr, "Json数据");
_listview.setItemText(item, 1, "" + js);
_listview.setItemText(item, 2, formatByte(js));
item = _listview.addItem(nilptr, "类实例");
_listview.setItemText(item, 1, "" + bc);
_listview.setItemText(item, 2, formatByte(bc * bs));
item = _listview.addItem(nilptr, "类对象");
_listview.setItemText(item, 1, "" + cc);
_listview.setItemText(item, 2, formatByte(cc * cs));
item = _listview.addItem(nilptr, "栈");
_listview.setItemText(item, 1, "" + sc);
_listview.setItemText(item, 2, formatByte(sc * ss));
item = _listview.addItem(nilptr, "线程");
_listview.setItemText(item, 1, "" + cxc);
_listview.setItemText(item, 2, formatByte(cxc * cxs));
item = _listview.addItem(nilptr, "用户对象");
_listview.setItemText(item, 1, "" + oc);
_listview.setItemText(item, 2, formatByte(oc * os));
item = _listview.addItem(nilptr, "读写锁");
_listview.setItemText(item, 1, "" + lc);
_listview.setItemText(item, 2, formatByte(lc * ls));
item = _listview.addItem(nilptr, "锁(条件变量)");
_listview.setItemText(item, 1, "" + dc);
_listview.setItemText(item, 2, formatByte(dc * ds));
item = _listview.addItem(nilptr, "字符串");
_listview.setItemText(item, 1, "" + tc);
_listview.setItemText(item, 2, formatByte(ts));
item = _listview.addItem(nilptr, "堆(已使用)");
_listview.setItemText(item, 1, "" + heap);
_listview.setItemText(item, 2, formatByte(heap));
if (_system_.getPlatformId() == 0){
item = _listview.addItem(nilptr, "堆(空闲)");
_listview.setItemText(item, 1, "" + uheap);
_listview.setItemText(item, 2, formatByte(uheap));
}else{
item = _listview.addItem(nilptr, "堆空闲(未监控)");
}
int pooltotal = ac * as + bc * bs + cc * cs + sc * ss + cxc * cxs + oc * os + lc * ls + dc * ds;
item = _listview.addItem(nilptr, "池");
_listview.setItemText(item, 1, "" + (int)pooltotal);
_listview.setItemText(item, 2, formatByte(pooltotal));
item = _listview.addItem(nilptr, "总计(已使用)");
_listview.setItemText(item, 1, "" + (long)(pooltotal + heap));
_listview.setItemText(item, 2, formatByte(pooltotal + heap));
long total_used_mem = pooltotal + heap + uheap + ts + au + js;
item = _listview.addItem(nilptr, "全部");
_listview.setItemText(item, 1, "" + (long)(pooltotal + heap + uheap));
_listview.setItemText(item, 2, formatByte(total_used_mem));
memwidget.addMemhistroy(total_used_mem);
memwidget.postUpdate();
}
}
}
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。