我正在JAVA与我的学校的朋友一起制作一个“应用程序”,它必须在Windows上运行进程/任务的状态。 例如,当“chrome.exe * 32”在实际打开的会话上运行时,他必须返回一个值。
我可能错了,但我在考虑使用类似的东西:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button btn1, btn2, btn3;
Animation show, hide;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn1.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(final View v) {
setBtn1();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(final View v) {
setBtn2();
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(final View v) {
setBtn3();
}
});
show = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.show);
hide = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.hide);
}
public void setBtn1() {
btn1.startAnimation(hide);
btn1.setClickable(false);
btn1.setVisibility(View.GONE);
}
public void setBtn2() {
btn2.startAnimation(hide);
btn2.setClickable(false);
btn2.setVisibility(View.GONE);
}
public void setBtn3() {
btn3.startAnimation(hide);
btn3.setClickable(false);
btn3.setVisibility(View.GONE);
}
}
或者可能与进程占用的内存有关,我真的不知道如何获得这个值。
感谢。
答案 0 :(得分:0)
我通过创建一个运行powershell命令并读回结果信息的进程解决了这个问题:
Process p = new ProcessBuilder()
.command("powershell", "invoke-command", "-computerName", "MYCOMPUTER", "-filepath", ".\\someScript.psl")
.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
p.waitFor();
List<String> results = new LinkedList();
String line;
while ((line == reader.readLine()) != null) results.add(line);
results
现在包含您创建的流程的所有结果输入。以下是someScript.psl
文件中包含的脚本:
$sched = New-Object -Com "Schedule.Service"
$sched.connect()
$out = @()
$sched.GetFolder("\").GetTasks(0) | % {
$xml = [xml]$_.xml
$out += New-Object psobject -Property @{
"Name" = $_.Name
"Status" = switch($_.State) {0 {"Unknown"} 1 {"Disabled"} 2 {"Queued"} 3 {"Ready"} $ {"Running"}}
"NextRunTime" = $_.NextRunTime
"LastRunTime" = $_.LastRunTime
"LastRunResult" = $_.LastTaskResult
"Author" = $xml.Task.Principals.Principal.UserID
"Created" = $xml.Task.RegistrationInfo.Date
}
}
$out | fl Name, Status, NextRunTime, LastRunTime, LastRunResult, Author, Created
答案 1 :(得分:0)
您可以使用java 9的ProcessHandle接口获取有关进程的信息。 要获取有关进程的信息,只需使用以下代码进行迭代并使用processHandle方法。
ProcessHandle.allProcesses().forEach(process -> processStateInfo(process));
下面的代码遍历所有进程并打印有关这些进程的一些信息。
public class JavaProcess {
public static void main(String[] args) {
ProcessHandle.allProcesses().forEach(process -> getProcessInfo(process));
}
private static void getProcessInfo(ProcessHandle process) {
System.out.println("PID == "+process.pid());
System.out.println("Is ProcessAlive=="+process.isAlive());
System.out.println("Command=="+process.info().command());
System.out.println("ProcessStartTime=="+process.info().startInstant());
System.out.println("Duration=="+process.info().totalCpuDuration());
System.out.println("Process User=="+process.info().user());
}
}
请注意,即使在请求进程终止后, isAlive()方法也可能会返回true一段时间。发生这种情况是因为进程是异步终止的。
这是ProcessHandle接口的文档。 http://download.java.net/java/jdk9/docs/api/java/lang/ProcessHandle.html