powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CDialog и кнопка Cancel
9 сообщений из 9, страница 1 из 1
CDialog и кнопка Cancel
    #32333517
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть модальный диалог, у него есть разные контролы, и вот при нажатии на одну кнопку мне нужно повесить часы и ждать завершения какого-то события, но нужно, чтобы одна кнопка Cancel была всегда доступна и на нее можно было нажать и прекратить ту опреацию, которую ждал.
Как разрешить нажимать одну конопку при часах?
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32333524
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну напрашивается решение с отдельной нитью на "процессе",
т.е. при нажатии на нужный контрол, дизаблиш все контролы кроме "Cancel",
взводиш семафор и запускаешь свой процесс (внутри процесса проверяешь семафор (ну я думаю что там все же цикл какой-нибудь)), при нажатии на "Cancel" сбрасываешь этот семафор, процесс видит что семафор сброшен и прекращает свою пагубную жизнедеятельность ...
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32333539
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при наличии цикла можно обойтись и без процесса, в цикле просто помещаешь обработку виндовых сообщений (GetMessage()/DispatchMessage()) и нет проблем.
если я правильно понял конечно.
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32333542
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если можно подробнее, что обрабатывать в цикле:
(GetMessage()/DispatchMessage())

Замечу, что часы висят в это время, т.е. CWaitcursor.
А то, чего я жду - это несколько thread'ов, которые запускаются параллельно, но в конце функции я жду окончания всех. Это объяснимо, поскольку это все хранимы процедуры SQL Server.
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32333599
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в цикле нужно обрабатывать виндовые сообщения. типа -
while (GetMessage())
DispatchMessage();
точнее сейчас не скажу, поскольку нахожусь в командировке, сижу в офисе, занимаюсь ерундой, скоро поезд
эта конструкция позволяет обойтись синхронным выполнением действий (если есть цикл), без создания ф-ии потока - лишь созданием ф-ии, в которой будет выполняться хранимая процедура. в случае наличия нескольких подобных процедур можно использовать и потоки.
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32333774
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Создай свой класс, наследуемый от CButton, перехватывай MOUSE_NCMOVE. Когда курсор над кпопкой, меняй его.

2.Создай свой курсор, похожий на часики, и сам обрабатывай его.
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32335029
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Winnipuh, видимо maratka имел ввиду нечто подобное
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while (GetMessage(&msg, // message structure
		NULL, // handle of window receiving the message
		 0 ,    // lowest message to examine
		 0 ))   // highest message to examine
	{
		TranslateMessage(&msg); // Translates virtual key codes
		DispatchMessage(&msg);  // Dispatches message to window
	}

На мой взгляд в вашем случае решение, предлженное olk-ом, более уместно.
Фактически при нажатии на кнопку (назовем ее Run) должен создаться некий управляющий поток, имеющий handle окна диалога (hwnd), который в свою очередь порождает все ваши рабочие потоки и полностью управляет ими - завершается по их полном завершении (семафор или набор событий), либо прерывает их в случае своего прерывания (событие). На выходе из управляющего потока SendMessage(hwnd, enable,...);
А вот, что предложил Tracer?
. По-моему это решение совсем другой задачи
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32336408
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал так:
Если время измеряется порядком 100 мс или больше, и не сильно критична дельта времени...

По кнопке Run задизаблил все контролы, завёл бы таймер на 10-20 мс и вставил бы туда проверку события .

Проще чем сред открывать и делать цикл обработки.
...
Рейтинг: 0 / 0
CDialog и кнопка Cancel
    #32336462
maratka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще чем вставить пять строчек цикла обработки сообщений ничего быть не может! А если клиент хочет отменить выполнение длинной операции? ему нужна интерактивность, а не подвисание прилады. имхо
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CDialog и кнопка Cancel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]