|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.12.2012, 19:38 | #1 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Диалоговое окно::атомарное выполнение оконной процедуры
Здравствуйте. Хочу понять: почему оконная процедура диалогового окна не выполняется атомарно, даже при использовании критической секции?
Код:
Последний раз редактировалось 220Volt; 14.12.2012 в 19:58. |
14.12.2012, 20:27 | #2 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Проверил - все действия совершаются от имени одного процесса:
Код:
|
14.12.2012, 21:08 | #3 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
С мьютексами такая же ерунда, ничего не пойму ...
Код:
|
14.12.2012, 21:49 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Mutex и Critical Section реентрантны, а поскольку у вас все в одном потоке захват и того и другого срабатывает.
Зачем вам синхронизация там? Из другого потока диалоговую процедуру можно вызвать только вручную... Вы явно путаетесь в терминологии. |
14.12.2012, 22:10 | #5 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Вы, наверное, невнимательно посмотрели на код, получение нескольких MessageBox’эв, не дает мне никаких гарантий о порядке обработки сообщений. Я ведь не управляю циклом сообщений (для диалогового окна), я не знаю что там MS придумало. Может каждое сообщение обрабатывается в отдельном потоке.
Последний раз редактировалось 220Volt; 14.12.2012 в 22:24. |
14.12.2012, 22:15 | #6 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Другими словами - я не уверен, что не возникнет одновременной обработки нескольких сообщений одного и того же диалогового окна. Получение нескольких MessageBox'эв это подтверждает.
|
14.12.2012, 23:02 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Повторяю еще раз - вызвать диалговую процедуру из другого потока можно только "искуственным" путем, вручную. Если сообщения посылаются из другого потока оно посылаются синхронизировано.
Разберитесь с терминологией - что такое "атомарность", "многопоточность" и "реентрантность" |
15.12.2012, 06:45 | #8 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Вам известно, что MessageBox() – создает модальное сообщение? А раз так, то поток, выполняющий оконную процедуру, не будет освобожден до тех пор, пока не будет закрыто этот MessageBox(). При наличии синхронизации, невозможно было бы получить несколько MessageBox() без закрытия предыдущего. Может мы друг друга не понимаем? Если Вам не сложно, скомпилируйте пример, думаю, все прояснится.
Насчет терминологии: атомарная операция – операция над данными, которую в каждый момент времени выполняет только один поток. Поток – то чему выполняется процессорное время, часть процесса. Реентрантность – исключение одновременного использование разделяемых данных. |
15.12.2012, 06:48 | #9 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
|
15.12.2012, 09:36 | #10 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Провел небольшой эксперимент с целью посмотреть какие потоки выполняют оконную процедуру.
Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Метода класса в качестве оконной процедуры формы | GydruS | Win Api | 3 | 13.01.2012 12:11 |
Подмена оконной процедуры, Как правильно завершить? | eduard93 | Win Api | 0 | 08.09.2011 16:45 |
Диалоговое окно | Busine2009 | Microsoft Office Word | 0 | 01.08.2009 09:15 |
Диалоговое окно | Михаил Юрьевич | Общие вопросы Delphi | 11 | 01.06.2009 20:31 |
Диалоговое окно | Beggins | Общие вопросы C/C++ | 3 | 09.05.2008 05:03 |