Как определить, что поток Win32 находится в состоянии ожидания или соединения или сна в C ++ - PullRequest
3 голосов
/ 18 ноября 2011

На самом деле я ищу эквивалент c ++ / win32 для .net Перечисление ThreadState .

Есть предложения?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

Между ними очень мало разницы, все ждут разные объекты ядра.

Под "ждать" я предполагаю, что вы имеете в виду "ожидание ввода / вывода". «Присоединиться» - это просто «ждать потока / процесса». А «Сон» - это «ждать таймера».

Чтобы еще больше усложнить ситуацию, поток может ожидать некоторую комбинацию объектов ядра.

Вы можете узнать, какие объекты ожидает поток, и тип этих объектов, используя отладчик ядра. Я не думаю, что есть более простой способ.

2 голосов
/ 18 ноября 2011

Прямого эквивалента не существует - управляемые и неуправляемые потоки не следует считать одинаковыми. Смотрите здесь .

ThreadId операционной системы не имеет фиксированной связи с управляемым поток, потому что неуправляемый хост может контролировать отношения между управляемые и неуправляемые темы. В частности, сложный хост может использовать Fiber API для планирования нескольких управляемых потоков по одному поток операционной системы, или для перемещения управляемого потока между различными потоки операционной системы.

1 голос
/ 20 сентября 2012

«Проблема» в том, что среда выполнения .NET владеет вашим потоком .NET.Так, например, когда вы вызываете Abort, внутреннее устройство времени выполнения выдает исключение ThreadAbortException в контексте .NET вашего потока .NET, и именно так вы можете перехватить его в своем потоке, используя catch (ThreadAbortException).

ИТо же самое верно и для ThreadState, так как он имеет базовое право собственности на ваш поток, он точно знает, что он делает, и, следовательно, может создать действительное состояние потока.

Поскольку не существует нехакенского способа официально запрашиватьпоток для его внутреннего состояния, вы можете обернуть это в классе.Но опять же, вы будете полностью зависеть от метода потока, который будет соответствовать любым запросам .Abort ().

1 голос
/ 19 ноября 2011

Единственное состояние нативного потока, легко доступное с помощью winapi, - это информация о том, закончил ли поток свое выполнение. Просто используйте функцию WaitForSingleObject() с дескриптором потока и временем ожидания 0:

DWORD res = WaitForSingleObject(handleThread, 0);
switch (res)
{
    case WAIT_OBJECT_0:
        printf("The thread has finished\n");
        break;
    case WAIT_TIMEOUT:
        printf("The thread is still running\n");
        break;
    default:
        printf("Unknown error (shouldn't happen)\n");
        break;

}
...