Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Простой потока


Автор: Toohtik 24.10.2007, 00:15
Каким образом можно узнать о приостановке потока. Я слыхал, что это все делается через структуру CONTEXT, но никак не найду соответствующий регистр. В принципе, если есть какой то метод MFC класса CWinThread, то он тоже пойдет. 

Автор: SergeCpp 24.10.2007, 08:39
Если это текущий поток, то в момент проверки он не простаивает

Иначе можно вызвать http://msdn2.microsoft.com/en-us/library/ms686345.aspx и по результату выяснить состояние,
потом при необходимости можно восстановить состояние потока, вызвав http://msdn2.microsoft.com/en-us/library/ms685086.aspx

Или же наоборот (Resume и Suspend)

Какую последовательность использовать — зависит от логики программы
(например, если останавливать поток нежелательно, вызовите сначала Resume)

Автор: alias_trinity 24.10.2007, 15:00
Есть натив функция NtQuerySystemInformation
С флагом SystemProcessesAndThreadsInformation получаешь процессы с приатаченными детальными структурами по всем потокам в этих процессах. Далее выбираешь нужный процесс и проходишся по массиву структур его потоков. В них есть поля State/WaitReason - это то, что тебе нужно.
Таблица состояний для State:
Код

typedef enum _THREADSTATE
{
     ThreadStateInitialized,
     ThreadStateReady,
     ThreadStateRunning,
     ThreadStateStandby,
     ThreadStateTerminated,
     ThreadStateWaiting,
     ThreadStateTransition,
     ThreadStateUnknown
} THREADSTATE;


Таблица состояний для WaitReason:
Код

typedef enum _KWAIT_REASON
{
    WaitReasonExecutive,
    WaitReasonFreePage,
    WaitReasonPageIn,
    WaitReasonPoolAllocation,
    WaitReasonDelayExecution,
    WaitReasonSuspended,
    WaitReasonUserRequest,
    WaitReasonWrExecutive,
    WaitReasonWrFreePage,
    WaitReasonWrPageIn,
    WaitReasonWrPoolAllocation,
    WaitReasonWrDelayExecution,
    WaitReasonWrSuspended,
    WaitReasonWrUserRequest,
    WaitReasonWrEventPair,
    WaitReasonWrQueue,
    WaitReasonWrLpcReceive,
    WaitReasonWrLpcReply,
    WaitReasonWrVirtualMemory,
    WaitReasonWrPageOut,
    WaitReasonWrRendezvous,
    WaitReasonSpare2,
    WaitReasonSpare3,
    WaitReasonSpare4,
    WaitReasonSpare5,
    WaitReasonSpare6,
    WaitReasonWrKernel
} KWAIT_REASON;

З.Ы. Сделай импорт ф-ции с ntdll.dll или подключи аналогичную либу

Автор: alias_trinity 26.10.2007, 09:16
Если с Натив АПИ никогда не работал, то состояние потока можно узнать так:
Код

bool stoping=(SuspendThread(hThread)>0); //не подставляй хендл своего процесса
ResumeThread(hThread);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)