Сейчас на форуме: _MBK_ (+7 невидимых)

 eXeL@B —› Основной форум —› Выполняется ли поток? Как узнать?
Посл.ответ Сообщение

Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 июня 2009 12:18 · Поправил: Enigma
· Личное сообщение · #1

Есть два потока, как из одно потока узнать, выполняется ли другой или уже нет? Хендлы потоков известны...




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 11 июня 2009 12:20
· Личное сообщение · #2

ну вот так можно
Code:
  1. BOOL GetExitCodeThread(
  2.  
  3.     HANDLE hThread,        // handle to the thread 
  4.     LPDWORD lpExitCode     // address to receive termination status 
  5.    );

...
If the specified thread has not terminated, the termination status returned is STILL_ACTIVE. If the thread has terminated, the termination status returned may be one of the following:

· The exit value specified in the ExitThread or TerminateThread function.
· The return value from the thread function.
· The exit value of the thread's process.

-----
[nice coder and reverser]




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 11 июня 2009 12:30
· Личное сообщение · #3

Теперь у crc и anti-inline потоков добавятся взаимные проверки на существование друг друга для усложнения )))

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 11 июня 2009 12:40
· Личное сообщение · #4

Smon

;)

и будут ловиться на GetExitCodeThread ))

-----
EnJoy!




Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 июня 2009 12:40
· Личное сообщение · #5

Hellspawn Да, точно, спасибо! Кстати пробовал сделать эту проверку через GetHandleInfromation, вроде бы как если поток допустим уничтожен, то и его хендл должен быть уничтожен, а нет, GetHandleInfromation все равно возвращает true.

Smon Так они и были... только через GetThreadContext, а оно оказывается не работает на последних Windows 7... FYI



Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 июня 2009 13:30 · Поправил: only
· Личное сообщение · #6

Enigma

NtQuerySystemInformation(SystemProcessesAndThreadsInformation(5)): :SYSTEM_PROCESSES.Threads[XXX].State&&WaitReason



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 11 июня 2009 14:39
· Личное сообщение · #7

only прав. Но это долго очень. Быстро можно узнать посредством NtSuspendThread, сервис увеличит счётчик остановок треда и возвратит предыдущее значение, после чего выполняем декремент счётчика дабы вернуть его в исходное значение посредством NtResumeThread. Это вернёт значение счётчика остановок треда. Размеется это не позволяет определить например ожидание треда на обьекте и пр.



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 07 августа 2009 07:23
· Личное сообщение · #8

В плане уничтожения, поток и его хендл не зависят друг от друга, поэтому функции типа GetHandleInformation или WaitForSingleObject могут не давать истинной картины.
Использовать GetExitCodeThread можно, но если код выхода (или ошибки) потока будет равен STILL_ACTIVE (259), то вряд ли мониторящий поток это поймет правильно .



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 07 августа 2009 12:51
· Личное сообщение · #9

Всем спасибо... тему можно закрыть...



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 07 августа 2009 16:12
· Личное сообщение · #10

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

Enigma пишет:
тему можно закрыть...

А сам?


 eXeL@B —› Основной форум —› Выполняется ли поток? Как узнать?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати