MFC / стороннее многопоточное зависание - PullRequest
0 голосов
/ 23 февраля 2012

В настоящее время я работаю над программой, использующей MFC.Текущая сторонняя функция запускает поток после того, как действие было выполнено с использованием MFC (т.е. проверка флажка, который запускает поток MFC, я полагаю).

Проблема возникает, когда я проверяю флажок, и в этот моментвся программа зависает.Я прочитал несколько интересных дискуссий по CProgramming и msdn, похоже, что проблема возникает из-за того, что новый сторонний поток вызывает WaitToSomething (), когда MFC обновляет элемент управления.

Что-то интересное, чтобы отметить:

  • Когда я отлаживаю программу, она зависает (или многократно вызывает WaitToRead ()) после того, как я установил флажок, и новый поток пытается запустить
  • Когда я запускаю программу без отладчика,программа в порядке, пока я не переключусь в другое окно (например, интернет-браузер, блокнот и т. д.)

Моя гипотеза:

  • проверьте, чтобы убедиться, что MFC завершил обновлениеконтроль перед началом новой темы

Если у кого-то есть предложения или решения, пожалуйста, оставьте комментарий.Спасибо.

Редактировать:

MFC не является поточно-ориентированным на уровне объекта (только на уровне класса), поэтому проблема возникает, когда два потока работают с одним и тем же объектом CButton.

Q: Как я могу сделать это потокобезопасным?

1 Ответ

0 голосов
/ 06 марта 2012

Коллега помог мне выяснить, в чем была проблема.

Причина, по которой он зависал, заключается в том, что элемент управления, содержащий флажок, является дочерним диалоговым окном, и когда он заканчивал обновление сообщения, оно никогда не передавалось.к своему родителю (поэтому, когда сторонний поток вызывает WaitFor (), поток MFC никогда не завершается, потому что родительский диалог считает, что его дочерний элемент все еще обновляет элементы управления).

Fix :

В разделе «Свойства» в элементе управления диалогового окна child установите для флага «Control» значение true (а если у него есть дочерние элементы, установите для флага «Control Parent» значение * 1013).* true также).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...