1

一度にたくさんのアプリケーションを実行しているPCを持っていますが、すべてのアプリケーションを一時停止することは可能だと思っていました。CPUを大量に使用している他の1つのアプリケーションを定期的に実行するために、すべてのプロセッサ時間を確保したいと考えていました。 。問題は、すべてのアプリケーションを一時停止して、CPUを頻繁に使用するものを実行し、その後、終了時にすべてのアプリケーションを再開し、すべての作業を正常に再開することです。

コメントは大歓迎です。

4

2 に答える 2

5

可能ですが、まったくお勧めしません。

プロセスとスレッドの優先度を設定して、アプリケーションにCPUのより大きなスライスが与えられるようにします。これはまた、あなたの方法がそうするように、それがデスクトップ、ネットワーク接続、アンチウイルス、スタートメニュー、ウィンドウマネージャーなどを殺さないことを意味します。

于 2012-04-25T12:48:15.313 に答える
0

要求が厳しすぎるプログラム(たとえば、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;
}
于 2020-01-12T12:56:51.963 に答える