Получение хэндла
От: YourLastSong  
Дата: 30.09.11 10:27
Оценка:
Здравствуйте, уважаемые господа.

У меня появилось неск. вопросов:

— Каким образом можно получить хэндл текущего потока, чтобы потом сделать SuspendThread и ResumeThread к нему из другого? Получить при помощи _beginthread не могу, т.к. это основной поток, начинающийся ещё с функции main ().

— Что такое _threadid? Я думал, что это абсолютно такое же значение, как хэндл текущего потока.

Заранее благодарю за возможные ответы.
Re: Получение хэндла
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.09.11 10:29
Оценка: +1
Здравствуйте, YourLastSong, Вы писали:

YLS>- Каким образом можно получить хэндл текущего потока, чтобы потом сделать SuspendThread и ResumeThread к нему из другого? Получить при помощи _beginthread не могу, т.к. это основной поток, начинающийся ещё с функции main ().


А можно встречный вопрос? Зачем вам понадобилось вручную ставить поток на паузу?
Re[2]: Получение хэндла
От: YourLastSong  
Дата: 30.09.11 10:33
Оценка:
Pzz>А можно встречный вопрос? Зачем вам понадобилось вручную ставить поток на паузу?

А что такое? Это так плохо?
Re[3]: Получение хэндла
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.09.11 10:37
Оценка:
Здравствуйте, YourLastSong, Вы писали:

Pzz>>А можно встречный вопрос? Зачем вам понадобилось вручную ставить поток на паузу?


YLS>А что такое? Это так плохо?


А зачем?
Re[4]: Получение хэндла
От: YourLastSong  
Дата: 30.09.11 10:45
Оценка:
Pzz>А зачем?

Предлагаете ожидать вкл. какого-то опр. флага или события? Можно и события вкл., и флаги, вопрос главное решить.
Re[5]: Получение хэндла
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.09.11 10:49
Оценка:
Здравствуйте, YourLastSong, Вы писали:

Pzz>>А зачем?


YLS>Предлагаете ожидать вкл. какого-то опр. флага или события? Можно и события вкл., и флаги, вопрос главное решить.


Вы пытаетсь обсуждать средства решения проблемы, не формулируя самой проблемы. Вы какую проблему-то собираетесь решить?
Re[6]: Получение хэндла
От: YourLastSong  
Дата: 30.09.11 11:01
Оценка:
Pzz>Вы пытаетсь обсуждать средства решения проблемы, не формулируя самой проблемы. Вы какую проблему-то собираетесь решить?

Мне надо временно остановить основной поток, пока не завершится тот поток, который пытается это сделать.
Re: Получение хэндла
От: Went  
Дата: 30.09.11 11:11
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Каким образом можно получить хэндл текущего потока, чтобы потом сделать SuspendThread и ResumeThread к нему из другого?


здесь
Re[2]: Получение хэндла
От: Сергей Мухин Россия  
Дата: 30.09.11 11:36
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, YourLastSong, Вы писали:


YLS>>- Каким образом можно получить хэндл текущего потока, чтобы потом сделать SuspendThread и ResumeThread к нему из другого?


W>здесь


это не подойдет. т.к.


Retrieves a pseudo handle for the calling thread.

---
С уважением,
Сергей Мухин
Re[2]: Получение хэндла
От: Сергей Мухин Россия  
Дата: 30.09.11 11:53
Оценка: 7 (1)
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, YourLastSong, Вы писали:


YLS>>- Каким образом можно получить хэндл текущего потока, чтобы потом сделать SuspendThread и ResumeThread к нему из другого? Получить при помощи _beginthread не могу, т.к. это основной поток, начинающийся ещё с функции main ().


Pzz>А можно встречный вопрос? Зачем вам понадобилось вручную ставить поток на паузу?


Еще одна ошибка: попытка «ручного управления» потоками
---
С уважением,
Сергей Мухин
Re[7]: Получение хэндла
От: Stanislav V. Zudin Россия  
Дата: 30.09.11 12:00
Оценка: +1
Здравствуйте, YourLastSong, Вы писали:

Pzz>>Вы пытаетсь обсуждать средства решения проблемы, не формулируя самой проблемы. Вы какую проблему-то собираетесь решить?


YLS>Мне надо временно остановить основной поток, пока не завершится тот поток, который пытается это сделать.


В основном потоке вызвать WaitForSingleObject(хендл_того_другого_потока, INFINITE); там, где это можно вызвать.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Получение хэндла
От: Pavel Dvorkin Россия  
Дата: 30.09.11 12:59
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

W>>здесь


СМ>это не подойдет. т.к.



СМ>

СМ>Retrieves a pseudo handle for the calling thread.


Вызвать после этого DuplicateHandle


    HANDLE hCurThread;
    DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&hCurThread, 0, FALSE,DUPLICATE_SAME_ACCESS);
///...
    CloseHandle(hCurThread);
With best regards
Pavel Dvorkin
Re[3]: Получение хэндла
От: ononim  
Дата: 30.09.11 13:29
Оценка:
Pzz>>А можно встречный вопрос? Зачем вам понадобилось вручную ставить поток на паузу?
YLS>А что такое? Это так плохо?
в over 99.9% случаев, когда это пытаются сделать люди, которые не знают разницы между id и хэндлом — это очень плохо
Как много веселых ребят, и все делают велосипед...
Re[4]: Получение хэндла
От: Went  
Дата: 30.09.11 18:09
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вызвать после этого DuplicateHandle


Да, именно это я и хотел сказать. Но промолчал
Re[7]: Получение хэндла
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 01.10.11 14:19
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>Мне надо временно остановить основной поток, пока не завершится тот поток, который пытается это сделать.


Во-первых, использовать SuspendThread для этого — все равно что забивать гвозди микроскопом, и вообще без SuspendThread лучше обходиться так же как без goto. Достаточно WaitForSingleObject на событии взводимом из "того потока" по окончании работы.

Во-вторых, немного подробнее бы о необходимости остановки основного потока?
---
С уважением,
Игорь
Re[7]: Получение хэндла
От: Pzz Россия https://github.com/alexpevzner
Дата: 01.10.11 14:46
Оценка:
Здравствуйте, YourLastSong, Вы писали:

Pzz>>Вы пытаетсь обсуждать средства решения проблемы, не формулируя самой проблемы. Вы какую проблему-то собираетесь решить?


YLS>Мне надо временно остановить основной поток, пока не завершится тот поток, который пытается это сделать.


Ну, например, это можно сделать следующим образом:
1) создаете семафор: handle = CreateSemaphore(...);
2) запускаете "тот поток, который пытается это сделать" (хотел бы я знать, что такое "это")
3) Основной поток ставит себя в ожидание на семафоре: WaitForSingleObject(handle,INFINITE)
4) "тот поток" делает "это"
5) сделав "это", поток сигнализирует семафор: ReleaseSemaphore(handle,1,NULL), после чего завершается, уходит на пенсию или я не знаю чего
6) основной поток просыпается, выходит из WaitForSingleObject(), и идет заниматься чем-нибудь полезным
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.