CEvent m_evStop;
// далее в конструкторе
m_evStop(FALSE/*init own*/, FALSE/*manual reset*/)
// в двух потоках ждем этот эвентwhile (WAIT_OBJECT_0 != ::WaitForSingleObject(m_evStop, 10)) {/*делаем что-то крайне бесполезное*/}
Каково же было мое удивление, что эвент оказывается сбрасывается функцией WaitForSingleObject и второй поток я рублю с помощью TerminateThread, узнал об этом как добавил логирование..
Как же одним эвентом остановить два потока? Итц поссибл?
Если я верно понял, то Вы пользуете автоматический сброс события (т.к. для мануального ресета надо вбрасывать второй параметр как TRUE). Далее всё просто — событие поднимает флаг сигнала, его проверяет один из потоков, а затем автоматически сбрасывает. В результате, второй поток понимает, что ему надо продолжать работу до следующего флага (который никто и не собирается взводить).
По идее, цепочка должна быть такая:
* создать событие с параметрами (FALSE, TRUE)
* чего-то происходит
* установить флаг сигнала
* дождаться через join окончания потоков
* сбросить руками флаг сигнала
Здравствуйте, Mr.Delphist, Вы писали:
MD>По идее, цепочка должна быть такая: MD>* создать событие с параметрами (FALSE, TRUE)
Логично, я так и пробовал, один из потоков сразу почему то выскакивает (тот, который запускаю первым), как будто эвент установлен
Почему только один из потоков — не понятно..
Здравствуйте, Hayabusa, Вы писали:
H>Здравствуйте, Mr.Delphist, Вы писали:
MD>>По идее, цепочка должна быть такая: MD>>* создать событие с параметрами (FALSE, TRUE)
H>Логично, я так и пробовал, один из потоков сразу почему то выскакивает (тот, который запускаю первым), как будто эвент установлен
Потому что есть два разных CEvent.
Один из MFC, с неправильным* порядком параметров, для него (FALSE, TRUE) будет то, что нужно — неустановленное, manual reset.
Другой из ATL, с правильным* порядком параметров, для него (FALSE, TRUE) будет то, что получилось — установленное, auto reset.
* "правильность" относительно соответствующей WinAPI фунции.
То есть, надо поменять параметры местами.
В качестве более дальновидного исправления — написать наследника с перечислениями, а не BOOL'ами в параметрах, уже тогда точно не получится ошибиться.
Параметр bInitialState можно, кстати, и не протягивать в такого наследника — заранее установленное событие нужно чуть чаще, чем никогда.
Здравствуйте, Alexander G, Вы писали:
AG>Потому что есть два разных CEvent.
AG>Один из MFC, с неправильным* порядком параметров, для него (FALSE, TRUE) будет то, что нужно — неустановленное, manual reset. AG>Другой из ATL, с правильным* порядком параметров, для него (FALSE, TRUE) будет то, что получилось — установленное, auto reset.
AG>* "правильность" относительно соответствующей WinAPI фунции.
AG>То есть, надо поменять параметры местами.
AG>В качестве более дальновидного исправления — написать наследника с перечислениями, а не BOOL'ами в параметрах, уже тогда точно не получится ошибиться. AG>Параметр bInitialState можно, кстати, и не протягивать в такого наследника — заранее установленное событие нужно чуть чаще, чем никогда.
Твоюж.... гребаный ассист показывал сигнатуру с MFC
Спасибо за подсказку я чет и не догадался пройти посмотреть в ATL )
Здравствуйте, Hayabusa, Вы писали:
H>Твоюж.... гребаный ассист показывал сигнатуру с MFC H>Спасибо за подсказку я чет и не догадался пройти посмотреть в ATL )
Ну что же, у нас снова подтвердились две прописных истины:
1) Ассист — зло
2) MFC — зло