Проверить из "волокна" "родительский" поток

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 3 дек 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Из осно вного потока запущен поток А, из А него поток Б.Как проверить из Б жив ли А?Пробовал так:
    Код (Text):
    1. DWORD WINAPI fibre(LPVOID lParam)
    2. {
    3.     HANDLE parent=(HANDLE)lParam;
    4.     printf("HANDLE: %d\n",parent);
    5.     printf("%X\n",WAIT_OBJECT_0);
    6.     //Sleep(1000);
    7.     printf("%X\n",WaitForSingleObject(parent,INFINITE));
    8.     return(0);
    9. }
    10. DWORD WINAPI thr(LPVOID lParam)
    11. {
    12.     printf("HANDLE: %d\n",GetCurrentThread());
    13.     CreateThread(0,0,&fibre,(LPVOID)GetCurrentThread(),0,0);
    14.     //Sleep(2000);
    15.     return(0);
    16. }
    17. int _tmain(int argc, _TCHAR* argv[])
    18. {
    19.     CreateThread(0,0,&thr,0,0,0);
    20.     getch();
    21.     return 0;
    22. }
    Но получаю WAIT_TIMEOUT вместо WAIT_OBJECT_0.Подскажите где я ошибся.
     
  2. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    >> Подскажите где я ошибся.

    GetCurrentThread возвращает псевдоописатель треда.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А как тогда нормальный указатель получить?
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Гм переделал вот так
    Код (Text):
    1. DWORD WINAPI fibre(LPVOID lParam)
    2. {
    3.     HANDLE parent=(HANDLE)lParam;
    4.     printf("HANDLE: %d\n",parent);
    5.     printf("%X\n",WAIT_OBJECT_0);
    6.     //Sleep(1000);
    7.     printf("%X\n",WaitForSingleObject(parent,0));
    8.     return(0);
    9. }
    10. DWORD WINAPI thr(LPVOID lParam)
    11. {
    12.     HANDLE self;
    13.     self=OpenThread(READ_CONTROL,false,GetCurrentThreadId());
    14.     printf("HANDLE: %d\n",self);
    15.     CreateThread(0,0,&fibre,(LPVOID)self,0,0);
    16.     //Sleep(2000);
    17.     return(0);
    18. }
    19. int _tmain(int argc, _TCHAR* argv[])
    20. {
    21.     CreateThread(0,0,&thr,0,0,0);
    22.     getch();
    23.     return 0;
    24. }
    теперь WAIT_FAILED =/
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    WaitForSingleObject генерирует ошибку ERROR_ACCESS_DENIED.Я получил неправильный указатель на поток?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    флаг SYNCHRONIZE нужен
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Все разобрался надо было так : self=OpenThread(SYNCHRONIZE,false,GetCurrentThreadId());
     
  8. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Ну и что? Внутри процесса все потоки пользуется одной и той же таблицей описателей объектов ядра.
     
  9. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    туплю