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

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

2.Создай свой курсор, похожий на часики, и сам обрабатывай его.
...
Рейтинг: 0 / 0
26.11.2003, 11:18
    #32335029
_Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDialog и кнопка Cancel
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
27.11.2003, 11:12
    #32336408
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDialog и кнопка Cancel
Я бы сделал так:
Если время измеряется порядком 100 мс или больше, и не сильно критична дельта времени...

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

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


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