题目要求
- 该题目要求使用两个链式线性表。一个链表存储当前活动进程,要求使用双向链表,排序要求是按照内存使用自多到少排序。另外一个链表存储已结束进程,要求使用单向链表,按照结束时间离当前时间的关系排序,最近的最前,最远的最后;
- 每秒在窗口内更新一次当前系统进程情况,输出內容包括:进程名,持续时间,内存使用情况;
- 每秒在窗口内更新一次已结束进程情况,输出内容包括:进程名,持续时间,结束时间;
- 注意进程在这两个链表中的切换,一个进程既可被结束,也可以过段时间后再被运行。
编码思路
一直在学习JavaScript,所以一开始想用JavaScript实现,但是想了想好像没那么简单去实现,因为JavaScript代码大多运行在浏览器的环境中,要想直接获取操作系统进程状况,肯定是不行的。于是google了一番,发现相关的资料很少,并且看到StackOverflow有一个帖子的回答是这样的:
我想知道是否可以在web浏览器(很可能是ie)中使用javascript来检索当前正在运行的进程列表?
我不想启动任何进程或关闭它们之类的。只是一个列表,我可以检查,然后说,例如,做其他事情,如果某个进程正在运行。
最佳答案:
不,您无法从以正常权限运行的基于浏览器的javascript获取有关操作系统进程的任何信息。
出于隐私和安全原因,浏览器javascript环境受到了非常仔细的保护,并与系统隔离。如果一个人能按你的要求做,那么互联网上的任何网页都能准确地看到你运行的程序,并能将这些信息发送回他们自己的服务器。
如果你愿意放松你的安全设置,一些版本的ie包含一些访问操作系统信息的能力(例如,请参见here),但是你应该意识到,如果你确实放松了你的安全设置,那么未知的网页可能能够访问此信息或在你的操作系统中也采取行动。其他浏览器甚至不包含常规网页的这种功能。由于只有一个浏览器支持此功能,并且只有在安全限制放松时,这在任何方面都不是通用浏览器功能。
于是就此作罢,重拾大一大二学的C++,为什么不用Java呢?因为网上有很多相关的教程,有很多同学用Java写,并且老师说不允许调用系统库函数,于是选择用C++完成这个课程设计。因为linux系统下的ps命令无法获取系统进程名,而题目要求进程名,于是选择在windows系统下完成课设,虽然windows下的wmic命令没有linux的ps命令那么直接显示持续时间,但是自己写一下时间转换函数,转换之后计算一下也不会特别麻烦。
具体编码细节思路见流程图:
完整代码
CurrentProcess.h
#pragma once
#include <iostream>
using namespace std;
struct CurrentProcess {
//当前进程节点
string name; //进程名
string duration; //持续时间
long memory; //使用内存
CurrentProcess* pre = nullptr;
CurrentProcess* next = nullptr;
CurrentProcess(string name, string duration, long memory) {
this->name = name;
this->duration = duration;
this->memory = memory;
}
};
class TwoLinkList {
//双向链表类
public:
CurrentProcess* head; //头指针
CurrentProcess* tail; //尾指针
int length; //链表长度
TwoLinkList(); //构造函数
~TwoLinkList(); //析构函数
void clone(const TwoLinkList& l); //拷贝函数
void downSort(); //降序排列
void addNode(string name, string duration, long memory); //向尾部添加节点
bool findNode(string name); //查找结点
void deleteNode(); //删除节点
void showNode(); //输出节点
};
CurrentProcess.cpp
#include<iomanip>
#include "CurrentProcess.h"
TwoLinkList::TwoLinkList() {
head = nullptr;
tail = nullptr;
length = 0;
}
TwoLinkList::~TwoLinkList() {
CurrentProcess* temp = head;
while (head != nullptr) {
head = head->next;
delete temp; //释放内存
temp = head;
}
length = 0;
head = tail = nullptr;
}
void TwoLinkList::clone(const TwoLinkList& backup) {
head = tail = nullptr;
length = 0;
if (backup.head != nullptr) {
CurrentProcess* p = backup.head;
head = new CurrentProcess(p->name, p->duration, p->memory);
length++;
p = p->next;
CurrentProcess* q = head;
while (p != nullptr)
{
q->next = new CurrentProcess(p->name, p->duration, p->memory);
q = q->next;
length++;
tail = p;
p = p->next;
}
int abc = 0;
}
}
void TwoLinkList::downSort() {
CurrentProcess* p, * q;
CurrentProcess temp(""