- если будет одновременный доступ к памяти из двух разных потоков, это само по себе приведет к ошибке?
Если ты пишешь, то и, наверное, читаешь? А как ты можешь быть уверен в том, что читаешь данные, которые записал правильный поток?
Ну мне просто надо проверять, не нужно ли приостановить выполнение того, что делает поток. Так как потом крутится в бесконечном цикле, если он лишний раз проскочит из-за того, что пропустил точный момент назначения значения - это не страшно
А конкретная задача? Ты точно не изобретаешь критические секции?
У меня поток щас считывает с порта значения. Я просто хочу сделать кнопку, которая приостанавливает процесс чтения
В ЯВУ постоянно советуют через переменную сделать, потому что "ууу, SuspendThread страааашно, боюсь!", но на деле через переменную цикл может просто проработать ещё лишний раз, остановка не мгновенной будет. Через SuspendThread - мгновенная.
А поток случайно не висит в WaitForSingleObject? Может порт закрыть, поток прибить, а когда понадобится — запустить заново?
Вполне возможно что висит
Но он разве не должен закончиться с ошибкой в случае закрытия?
Не знаю, кто он, но ты можешь сделать WaitForMultipleObjects, например. Первый объект, которого ждёшь — порт или событие от OVERLAPPED, второй объект событие для потока. Ты сигналишь событие, поток получает WAIT_OBJECT_0 + 1 и красиво выходит.
Ну мне то не надо чтобы поток выходил, просто на паузу встал и чтобы никаких проблем из-за этого не возникло
Ну можешь не выходить, а снова повиснуть в ожидании, только на вот этом втором событии потока. Юзер нажмёт продолжить, ты посигналишь событием, поток снова начнёт ждать чтения и события потока. Но если у тебя порт открыт, и ты из него просто не читаешь, буферы переполнятся, данные всё равно будут теряться. Что тебе пауза даёт?
Просто чтобы перестало лететь в вывод то, что приходит😁
Придумал. Ты можешь выключить EDIT вывода, а в потоке перед выводом проверять, включен он или нет.
Легче просто завести переменную и по её состоянию определять, нужно делать вывод или нет😁
Нет, это race condition. А на WinAPI можно положиться, там обратные вызовы и прочие крутые штучки.
race condition?
Никаких рейсов. Текст ведь отображает тот же самый поток, что будет кнопку обрабатывать, так?
Вроде, нет. Поток там отдельный чисто для вывода, а кнопка в главном потоке, в обработчике окна.
Даже если и так, из переменной прочитается либо ноль, либо не ноль. Не могу придумать, как оно могло бы сломаться. Это же не read-modify-write, просто запись. Не успеет поток новое состояние переменной прочитать в момент нажатия кнопки, ну так и фиг бы с ним, в следующий раз прочитает.
А почему ты так не сделаешь?
Да я думал че потоку вхолостую работать
Почему вхолостую то? Ты про тот случай, что он может пропустить 1 цикл?
Про то, что поток читает, а считанное никому не нужно
Обсуждают сегодня