Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как кнопкой прервать длительную функцию? 
V
    Опции темы
ksili
Дата 28.1.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Приложение на MFC.

По кнопке на форме запускаю функцию. Она может выполняться долго. Хотелось бы иметь возможность ее прервать. 
Как это сделать попроще, без потоков?

У меня была такая идея. но не хватило опыта ее реализовать. В этой долгой функции периодически проверяется очередь сообщений. Видел такой код:
Код

 for( ; GetMessage(lpMsg, hWnd, 0, 0); DispatchMessage(lpmsg) );

но не смог его приспособить для себя. Что за lpMsg и hWnd должны быть?
ну и из этих сообщений надо ловить определенноё - от кнопки которая останавливает этот процесс. Наверно для этого надо будет определить свойй тип сообщений - типа WM_STOP. Как это сделать тоже неосилил пока. 

Может кто-то делал подобное и может направить меня в нужное русло?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mrbrooks
Дата 28.1.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



ksili, как вариант - создать поток - запихнуть в него твою функцию. этим потоком, через гуй, можешь затем манипулировать.
PM MAIL   Вверх
ksili
Дата 28.1.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



С этим я чуть попозже разберусь. Я в MFC второй день. Не врубаюсь пока как AfxBeginThread указать, ждать поток или пусть параллельно работает.

А пока 
Цитата(ksili @  28.1.2009,  18:49 Найти цитируемый пост)
Как это сделать попроще, без потоков?

Тем более эта функция может себя рекурсивно вызывать. Так что на потоки переделать быстро не получится.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
voov
Дата 28.1.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Без потоков. 
Делаешь флаг - bool m_shouldRun;
По кнопке, которая запускает функцию, взводишь флаг, а по другой кнопке - сбрасываешь.
Внутри функции проверяешь флаг и либо продолжаешь работу, либо завершаешь.
Плюс внутри функции нужно периодически давать приложению обрабатывать сообщения, иначе флаг по кнопке не сбросится. Как это сделать сходу не скажу, не помню, нужно поискать...
PM MAIL   Вверх
ksili
Дата 28.1.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Цитата(voov @  28.1.2009,  19:23 Найти цитируемый пост)
Плюс внутри функции нужно периодически давать приложению обрабатывать сообщения, иначе флаг по кнопке не сбросится. Как это сделать сходу не скажу, не помню, нужно поискать...

Собственно, у меня в этом же загвоздка


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
voov
Дата 28.1.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



вот нашел. сделай как здесь.
создай подобный метод и периодически вызывай его из своей "длинной" функции.
PM MAIL   Вверх
Andrey44
Дата 28.1.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Код

volatile bool flag;



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
voov
Дата 28.1.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



нет, Andrey44, не поможет smile, дело в том, что код flag = false; просто не будет выполнен, если главное окно не обработает сообщения от кнопки...
PM MAIL   Вверх
Andrey44
Дата 28.1.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



voov, Ну да, нужно периодически обрабатывать очередь сообщений. GetMessage? DispatchMessage и т.д.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 28.1.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



PickMessage + DispatchMessage


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.