Fungsi SetThreadPriority (processthreadsapi.h)
Mengatur nilai prioritas untuk utas yang ditentukan. Nilai ini, bersama dengan kelas prioritas proses utas, menentukan tingkat prioritas dasar utas.
Sintaks
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
Parameter
[in] hThread
Handel ke utas yang nilai prioritasnya akan ditetapkan.
Handel harus memiliki hak akses THREAD_SET_INFORMATION atau THREAD_SET_LIMITED_INFORMATION . Untuk informasi selengkapnya, lihat Keamanan Utas dan Hak Akses. Windows Server 2003: Handel harus memiliki hak akses THREAD_SET_INFORMATION .
[in] nPriority
Nilai prioritas untuk utas. Parameter ini bisa menjadi salah satu nilai berikut.
Jika utas memiliki kelas dasar REALTIME_PRIORITY_CLASS , parameter ini juga bisa -7, -6, -5, -4, -3, 3, 4, 5, atau 6. Untuk informasi selengkapnya, lihat Prioritas Penjadwalan.
Mengembalikan nilai
Jika fungsi berhasil, nilai yang dikembalikan bukan nol.
Jika fungsi gagal, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Windows Phone 8.1: aplikasi Windows Phone Store dapat memanggil fungsi ini tetapi tidak berpengaruh. Fungsi akan mengembalikan nilai bukan nol yang menunjukkan keberhasilan.
Keterangan
Setiap utas memiliki tingkat prioritas dasar yang ditentukan oleh nilai prioritas utas dan kelas prioritas prosesnya. Sistem menggunakan tingkat prioritas dasar dari semua utas yang dapat dieksekusi untuk menentukan utas mana yang mendapatkan iringan waktu CPU berikutnya. Utas dijadwalkan dengan cara round-robin di setiap tingkat prioritas, dan hanya ketika tidak ada utas yang dapat dieksekusi pada tingkat yang lebih tinggi, penjadwalan utas pada tingkat yang lebih rendah terjadi.
Fungsi SetThreadPriority memungkinkan pengaturan tingkat prioritas dasar utas relatif terhadap kelas prioritas prosesnya. Misalnya, menentukan THREAD_PRIORITY_HIGHEST dalam panggilan ke SetThreadPriority untuk utas proses IDLE_PRIORITY_CLASS mengatur tingkat prioritas dasar utas ke 6. Untuk tabel yang memperlihatkan tingkat prioritas dasar untuk setiap kombinasi kelas prioritas dan nilai prioritas utas, lihat Prioritas Penjadwalan.
Untuk proses IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, ABOVE_NORMAL_PRIORITY_CLASS, dan HIGH_PRIORITY_CLASS , sistem secara dinamis meningkatkan tingkat prioritas dasar utas ketika peristiwa terjadi yang penting untuk utas. REALTIME_PRIORITY_CLASS proses tidak menerima peningkatan dinamis.
Semua utas awalnya dimulai pada THREAD_PRIORITY_NORMAL. Gunakan fungsi GetPriorityClass dan SetPriorityClass untuk mendapatkan dan mengatur kelas prioritas proses. Gunakan fungsi GetThreadPriority untuk mendapatkan nilai prioritas utas.
Gunakan kelas prioritas proses untuk membedakan antara aplikasi yang sangat penting waktu dan yang memiliki persyaratan penjadwalan normal atau di bawah normal. Gunakan nilai prioritas utas untuk membedakan prioritas relatif tugas proses. Misalnya, utas yang menangani input untuk jendela dapat memiliki tingkat prioritas yang lebih tinggi daripada utas yang melakukan perhitungan intensif untuk CPU.
Saat memanipulasi prioritas, berhati-hatilah untuk memastikan bahwa utas prioritas tinggi tidak mengonsumsi semua waktu CPU yang tersedia. Utas dengan tingkat prioritas dasar di atas 11 mengganggu pengoperasian normal sistem operasi. Menggunakan REALTIME_PRIORITY_CLASS dapat menyebabkan cache disk tidak memerah, menyebabkan mouse berhenti merespons, dan sebagainya.
Nilai THREAD_PRIORITY_* memengaruhi prioritas penjadwalan CPU utas. Untuk utas yang melakukan pekerjaan latar belakang seperti I/O file, I/O jaringan, atau pemrosesan data, tidak cukup untuk menyesuaikan prioritas penjadwalan CPU; bahkan utas prioritas CPU menganggur dapat dengan mudah mengganggu responsivitas sistem ketika menggunakan disk dan memori. Utas yang melakukan pekerjaan latar belakang harus menggunakan nilai THREAD_MODE_BACKGROUND_BEGIN dan THREAD_MODE_BACKGROUND_END untuk menyesuaikan prioritas penjadwalan sumber dayanya; utas yang berinteraksi dengan pengguna tidak boleh menggunakan THREAD_MODE_BACKGROUND_BEGIN.
Ketika utas berada dalam mode pemrosesan latar belakang, utas harus meminimalkan berbagi sumber daya seperti bagian penting, tumpukan, dan penanganan dengan utas lain dalam proses, jika tidak, inversi prioritas dapat terjadi. Jika ada utas yang dijalankan pada prioritas tinggi, utas dalam mode pemrosesan latar belakang mungkin tidak segera dijadwalkan, tetapi tidak akan pernah kelaparan.
Windows Server 2008 dan Windows Vista: Saat sistem dimulai, fungsi SetThreadPriority mengembalikan nilai pengembalian keberhasilan tetapi tidak mengubah prioritas utas untuk aplikasi yang dimulai dari folder Startup sistem atau tercantum dalam HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run kunci registri. Aplikasi ini berjalan pada prioritas yang dikurangi untuk waktu yang singkat (sekitar 60 detik) untuk membuat sistem lebih responsif terhadap tindakan pengguna selama startup.
Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store.
Windows Phone 8.1:Windows Phone Store dapat memanggil fungsi ini tetapi tidak berpengaruh.
Contoh
Contoh berikut menunjukkan penggunaan mode latar belakang utas.
#include <windows.h>
#include <tchar.h>
int main( void )
{
DWORD dwError, dwThreadPri;
if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN))
{
dwError = GetLastError();
if( ERROR_THREAD_MODE_ALREADY_BACKGROUND == dwError)
_tprintf(TEXT("Already in background mode\n"));
else _tprintf(TEXT("Failed to enter background mode (%d)\n"), dwError);
goto Cleanup;
}
// Display thread priority
dwThreadPri = GetThreadPriority(GetCurrentThread());
_tprintf(TEXT("Current thread priority is 0x%x\n"), dwThreadPri);
//
// Perform background work
//
;
if(!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END))
{
_tprintf(TEXT("Failed to end background mode (%d)\n"), GetLastError());
}
Cleanup:
// Clean up
;
return 0;
}
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows XP [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Target Platform | Windows |
Header | processthreadsapi.h (termasuk Windows.h pada Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Pustaka | Kernel32.lib; WindowsPhoneCore.lib di Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll pada Windows Phone 8.1 |