2010-05-19 3 views
6
if (reader.is_lazy()) goto tldr; 

У меня есть фоновый поток, который выполняет некоторые работы с фоновой подсветкой ввода-вывода. Угодить другие потоки и процессы, запущенные, я установил приоритет потока в «фоновый режим» с помощью SetThreadPriority, как это:Определите, имеет ли текущий поток низкий приоритет ввода/вывода

SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

Однако THREAD_MODE_BACKGROUND_BEGIN доступна только в Windows Server 2008 или более поздней версии, а также Windows Vista и новее, но программа также должна хорошо работать на Windows Server 2003 и XP. Таким образом, реальный код больше, как это:

if (!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); 
} 

Проблема с этим состоит в том, что в Windows XP это полностью разрушит систему, используя слишком много I/O. У меня есть план для уродливого и позорного способа смягчения этой проблемы, но это зависит от того, насколько я способен определить, имеет ли текущий поток низкий приоритет ввода-вывода или нет.

Теперь я знаю, что могу сохранить приоритет нити, в котором я закончил настройку, но поток управления в программе не очень хорошо подходит для этого. Я бы предпочел, чтобы иметь возможность проверить позже, имеет ли текущий поток низкий приоритет ввода-вывода - если он находится в «фоновом режиме».

tldr: 

GetThreadPriority не кажется, чтобы дать мне эту информацию, она дает только приоритет процессора.

Есть ли способ определить, имеет ли текущий поток низкий приоритет ввода/вывода?

+0

Как GetThreadPriority не работает? – Goz

+0

@Goz: Он дает только приоритет ЦП. Я обновил вопрос, чтобы включить это. –

+0

Я вижу ... интересный. – Goz

ответ

3

Ну, это не удается, если вы уже установили его в фоновом режиме. Не могли бы вы, в зависимости от того, хотите ли вы, чтобы это была фоновая обработка, а не просто установите приоритет для начала фона и посмотрите, не сработает ли он?

Если вы ожидаете/хотите, чтобы этого не было, тогда вы можете протестировать, вызвав конец фона.

Если вам это нехорошо, вам, вероятно, будет лучше всего использовать только локальное хранилище потоков, чтобы сохранить, находится ли он в фоновом режиме или нет.


Редактировать Магнуса Hoff: Вот как я в конечном итоге его реализации:

bool has_low_io_priority() { 
    if (SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) { 
     // Seems we were able to enter background mode. That means we were 
     // not in background mode from before. 
     SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 
     return false; 
    } else { 
     DWORD err = GetLastError(); 
     if (err == ERROR_THREAD_MODE_ALREADY_BACKGROUND) return true; 
     else return false; //< Background mode is not available at all 
    } 
} 

Хорошо работает :)

Смежные вопросы