一度にたくさんのアプリケーションを実行しているPCを持っていますが、すべてのアプリケーションを一時停止することは可能だと思っていました。CPUを大量に使用している他の1つのアプリケーションを定期的に実行するために、すべてのプロセッサ時間を確保したいと考えていました。 。問題は、すべてのアプリケーションを一時停止して、CPUを頻繁に使用するものを実行し、その後、終了時にすべてのアプリケーションを再開し、すべての作業を正常に再開することです。
コメントは大歓迎です。
一度にたくさんのアプリケーションを実行しているPCを持っていますが、すべてのアプリケーションを一時停止することは可能だと思っていました。CPUを大量に使用している他の1つのアプリケーションを定期的に実行するために、すべてのプロセッサ時間を確保したいと考えていました。 。問題は、すべてのアプリケーションを一時停止して、CPUを頻繁に使用するものを実行し、その後、終了時にすべてのアプリケーションを再開し、すべての作業を正常に再開することです。
コメントは大歓迎です。
可能ですが、まったくお勧めしません。
プロセスとスレッドの優先度を設定して、アプリケーションにCPUのより大きなスライスが与えられるようにします。これはまた、あなたの方法がそうするように、それがデスクトップ、ネットワーク接続、アンチウイルス、スタートメニュー、ウィンドウマネージャーなどを殺さないことを意味します。
要求が厳しすぎるプログラム(たとえば、Steam.exe、chrome.exe、90GB-video-game.exeなど)を自分で手動で生成したリストを保持することもできます。基本的に、実行中のすべてのプロセスのリスト全体を取得し、そのリストでブラックリストに登録されたすべての名前を検索し、NtSuspendProcess / NtResumeProcess(将来再び実行できるようにする必要がある場合)を取得します。
すべてのユーザープロセスを一時停止することは良い考えではないと思います。それらの多くは奇妙に保護されており、とにかく実行し続ける必要があります。それは困難な戦いであり、得るものはほとんどありません。
別の回答で述べたように、もちろん、許可があればプロセスの優先順位を上げることができます。これにより、OS全体のプロセスリストがプロセスに優先してソートされるため、最初にCPU時間を取得します。
これは、元のリクエストに似たものの例です。私はこの正確な機能を必要とするC++でプログラムを書いているので、私は助けになると思いました。これにより、Steam.exeまたはchrome.exeが検出され、最初に検出されたものが10秒間中断されます。その後、再開されます。一時停止中にウィンドウを操作しようとすると、Windowsでは「応答していません」と表示されます。一部のアプリケーションは、YMMVの一時停止を好まない場合があります。
/*Find, suspend, resume Win32 C++
*Written by jimmio92. No rights reserved. Public domain.
*NO WARRANTY! NO LIABILITY! (obviously)
*/
#include <windows.h>
#include <psapi.h>
typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);
typedef LONG (NTAPI *NtResumeProcess)(IN HANDLE ProcessHandle);
NtSuspendProcess dSuspendProcess = nullptr;
NtResumeProcess dResumeProcess = nullptr;
int get_the_pid() {
DWORD procs[4096], bytes;
int out = -1;
if(!EnumProcesses(procs, sizeof(procs), &bytes)) {
return -1;
}
for(size_t i = 0; i < bytes/sizeof(DWORD); ++i) {
TCHAR name[MAX_PATH] = "";
HMODULE mod;
HANDLE p = nullptr;
bool found = false;
p = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, procs[i]);
if(p == nullptr)
continue;
DWORD unused_bytes_for_all_modules = 0;
if(EnumProcessModules(p, &mod, sizeof(mod), &unused_bytes_for_all_modules)) {
GetModuleBaseName(p, mod, name, sizeof(name));
//change this to use an array of names or whatever fits your need better
if(strcmp(name, "Steam.exe") == 0 || strcmp(name, "chrome.exe") == 0) {
out = procs[i];
found = true;
}
}
CloseHandle(p);
if(found) break;
}
return out;
}
void suspend_process_by_id(int pid) {
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if(h == nullptr)
return;
dSuspendProcess(h);
CloseHandle(h);
}
void resume_process_by_id(int pid) {
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if(h == nullptr)
return;
dResumeProcess(h);
CloseHandle(h);
}
void init() {
//load NtSuspendProcess from ntdll.dll
HMODULE ntmod = GetModuleHandle("ntdll");
dSuspendProcess = (NtSuspendProcess)GetProcAddress(ntmod, "NtSuspendProcess");
dResumeProcess = (NtResumeProcess)GetProcAddress(ntmod, "NtResumeProcess");
}
int main() {
init();
int pid = get_the_pid();
if(pid < 0) {
printf("Steam.exe and chrome.exe not found");
}
suspend_process_by_id(pid);
//wait ten seconds for demonstration purposes
Sleep(10000);
resume_process_by_id(pid);
return 0;
}