Как узнать, приостановлен ли поток под Windows CE? - PullRequest
7 голосов
/ 22 мая 2009

Можно ли получить счетчик приостановки потоков в Windows CE, используя C или Visual C ++, без вызова функций возобновления или приостановки? Единственный способ увидеть это - что-то вроде

int Count = SuspendThread(ThreadHandle);  
ResumeThread(ThreadHandle);

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

int Count = ResumeThread(ThreadHandle);
SuspendThread(ThreadHandle);  

Но у этого есть похожие проблемы. Какой-нибудь хороший альтернативный метод получения количества приостановок от ручки?

Ответы [ 4 ]

4 голосов
/ 22 мая 2009

У меня есть комбинированное решение. Используйте WaitForSingleObject (), чтобы определить, приостановлен поток или нет.

Если он не приостановлен, число приостановок, очевидно, равно 0.

Если он приостановлен, можно вызвать SuspendThread (), чтобы получить счетчик приостановок. Поскольку он уже приостановлен, вы ничего не остановите.

1 голос
/ 23 октября 2009

Вы не должны приостанавливать поток на любой платформе.

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

Следующие операции над потоками должны быть полностью запрещены на любой платформе для любого программиста:

  • Приостановка
  • Возобновить (поскольку вам это не нужно, если вы не можете приостановить поток)
  • Убить / Abort

Вы никогда не должны насильно навязывать свою волю извне. У вас нет гарантии, что он делает, какие ресурсы он блокирует.

Всегда писать потоки в кооперативном режиме. Ваша нить должна знать о своем окружении и поддаваться желаниям внешнего мира либо выйти упорядоченно, либо сделать паузу, пока не сможет безопасно продолжить.

0 голосов
/ 23 октября 2009

Даже в потоке в Active вы все равно получите результат WAIT_TIMEOUT, потому что потоки сигнализируют только когда они заканчивают, а не когда они работают.

При этом WaitForSingleObject (hThread, INFINITE) ожидает завершения потоков.

0 голосов
/ 22 мая 2009

Возможно, с помощью WaitForSingleObject вы можете проверить, приостановлен ли поток, но вы не можете получить счетчик приостановки.

...