Уважаемые эксперты! Столкнулся с такой проблемой: надо реализовать
приостановку (suspend) потока. Поток ДОЛЖЕН уметь приостанавливать сам
себя. MSDN говорит, что SuspendThread использовать не желательно,
поэтому я объявляю переменную, например, LONG volatile suspend, а в
цикле потока добавляю строчку while(suspend)Sleep(0); Теперь собственно
проблема. Изменение этой переменной хочу реализовать с помощью
Interlocked функций. НО у меня в WinBase.h InterlockedCompareExchange
описана так ...(PVOID *dst,PVOID exc,PVOID cmp); А в MSDN -
...(LONG volatile* dst,LONG exc,LONG cmp); Так кто-же прав - мой winbase (из VC++ 6.0) или MSDN.Jan2004 ?
Или все-таки можно использовать SuspendThread ?
Отправлен: 02.02.2005, 19:55
Вопрос задал: Сергей Геннадьевич (статус: Читатель)
Всего ответов отправлено: 5
Отвечает: Bob Johnson
Здравствуйте, Сергей Геннадьевич! Я думаю, что нежелательно использовать suspendthread на своем потоке потому, что он (возможно) будет приостановлен не сразу же, а по истечении некоторого времени, когда windows надумает передать управление другому потоку или ты выполнишь какую-либо функцию, которая передаст управление другому потоку. На счет функции - а ты не перепутал описание с функцией InterlockedCompareExchangePointer? Если нет, то я бы верил тому, что в MSDN - это логичней.
* EMan2.0: ---===*** Debug mode ***===---
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 02.02.2005, 20:30
Отвечает: CrackLab
Здравствуйте, Сергей Геннадьевич!
Дело в том что и LONG и PVOID - это на самом деле 4х байтовые ячейки памяти (DWORD). Так что нельзя сказать кто прав. Хотя судя по параметрам, логичнее было бы первому параметру сделать тип PVOID, а второму и третьему LONG. Но в любом случае просто сделайте приведение типов так как этого требует ваш компилятор.
А вообще я писал программы работающие с потоками и остановку делал через SuspendThread. Да и мне кажется это будет лучше чем нагружать поток теоретически бесконечным циклом while.
Ответ отправил: CrackLab (статус: Студент)
Отправлен: 02.02.2005, 20:42
Отвечает: __grey__
Здравствуйте, Сергей Геннадьевич!
{
В данном случае прав MSDN (к сожалению пример пока дать нет возможности).
Кстати Interlocked функции не работают в Win9x/ME поэтому использование SuspendThread более универсально.
Кстати Sleep очень нагружает систему.
Лучше использовать WaitForSingleObject (см. Приложение 1).
По поводу SuspendThread выдержки из книги Рихтера "Windows для профессионалов" (см. Приложение 2). То есть использовать для приостановки самого себя в принципе можно без проблем, было бы кому его потом запустить.
}
Приложение:
Ответ отправил: __grey__ (статус: 1-ый класс)
Отправлен: 03.02.2005, 07:40
Отвечает: DiGiT
Здравствуйте, Сергей Геннадьевич!
Попробуйте не так. Шлете сообщение своему потоку(диспетчеру), который будет уметь его обрабатывать. В принципе этим потоком может служить главная оконная процедура твоего приложения, можете использовать что угодно для передачи сообщений(pipe, shared memory...)
Ответ отправил: DiGiT (статус: 6-ой класс)
Отправлен: 03.02.2005, 09:56
Отвечает: AxMAD
Здравствуйте, Сергей Геннадьевич!
Вообще лучше даже может быть испольсовать объект события(CreateEvent,SetEvent)!
А вот насчёт PVOID InterlockedCompareExchange(
PVOID *Destination, // указатель на другое значение, может игнорироваться
PVOID Exchange, // меняемое значение
PVOID Comperand // Specifies the value to compare to Destination. This is a 32-bit value. The sign is ignored.
);
Ответ отправил: AxMAD (статус: 10-ый класс)
Отправлен: 03.02.2005, 10:32