|
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
|
|||||||||||
Принудительный выход из цикла - отдельный поток или другое решение?13.10.2011, 19:41. Показов 5252. Ответов 27
Метки нет (Все метки)
Visual Studio 2008 SP1, диалоговый проект MFC.
В таблицу загружаются данные (цикл примерно из 9000 проходов). Операция занимает не 1 минуту. Нужно каким-то способом останавливать процесс загрузки (например, по нажатию клавиши Esc). Но пока идет заполнение таблицы, окно программы не принимает никакие сообщения. Как лучше это реализовать? Пробовал создавать отдельный поток (до этого с многопоточностью не работал, поэтому плохо в них разбираюсь).
C2248: 'CTablicaDlg::FillGrid' : cannot access protected member declared in class 'CTablicaDlg'. C2352: 'CTablicaDlg::FillGrid' : illegal call of non-static member function. Собирался по нажатию Esc присвоить переменной цикла значение 9000, что остановило бы цикл. Гугление ни к чему не привело. Точнее нашел кое-что:
0
|
|||||||||||
| 13.10.2011, 19:41 | |
|
Ответы с готовыми решениями:
27
Принудительный выход из цикла Принудительный выход из цикла for Принудительный выход из цикла |
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|||||
| 13.10.2011, 23:03 | |||||
|
здесь он говорит что метод только для наследников (protected member) и снаружи класса не достучатся дай отдохнуть процессору Добавлено через 2 минуты можно попробовать переопределить IsIdle и в ней заполнять структуру она будет вызыватся когда очередь сообщений у окна пуста
0
|
|||||
|
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
|
|
| 13.10.2011, 23:17 [ТС] | |
|
ValeryS, если sleep(100) поставить, то время выполнения увеличится на 900 секунд) попробую CTablicaDlg *pDlg = (CTablicaDlg *)Param и еще поковыряться. Спасибо за ответ
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|
| 13.10.2011, 23:21 | |
|
поставь sleep(10) sleep(5)
главное дать процессору отвлечься от твоего цикла
0
|
|
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
||
| 13.10.2011, 23:48 | ||
|
хм, а не проще ли использовать winAPI поместив в цикл функцию которая проверяет и достает из стэка сообщений если таковое имеется и дальнейшая обработка данного сообщения сообщение может быть любое, пусть то будет клавиша ESC или еще что-то , так же можно ограничить обработку сообщения если только будет нажата нужная кнопка. Функция- PeekMessage()
Добавлено через 1 минуту даже если дать дополнительный поток, тогда эта задержка также никчему)
0
|
||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|
| 13.10.2011, 23:58 | |
|
0
|
|
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
||
| 14.10.2011, 00:00 | ||
|
0
|
||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||
| 14.10.2011, 00:04 | ||
|
я говорю о ресурсоемких потоках которые могут захватить процессор (зависит и от приоритета) и другой поток будет вызываться неравномерно с задержками а слип это исправляет(сталкивался не один раз)
0
|
||
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|
| 14.10.2011, 00:15 | |
|
скачки между потоками происходят не равномерно по определению))))
в любом случае задержка не для данных целий необходима и создавалась.ИМХО это не грамотное решение на худой конец вставить в конец или начало цикла какой нибудь if который бы проверял нажали ли кнопкуу или нет, но ни как не создавать для данной задачи два потока и вставлять задержки в ресурсоемкий цикл.
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||||
| 14.10.2011, 00:37 | ||||
|
например чтение с ком порта??? Добавлено через 3 минуты если поток захватит процессор тут и перерисовка тормознет и другие приложения подвиснут (никогда не сталкивался?)
0
|
||||
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
||
| 14.10.2011, 01:01 | ||
|
а задержкой ты увеличиваешь и так большое время обработки... а для чтения с ком порта-то зачем два потока?)
0
|
||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||
| 14.10.2011, 01:06 | ||
|
программа повисла а если в одном потоке чтение а в другом управление то все путем это не только с комом это и с интернетом может быть
0
|
||
| 14.10.2011, 02:18 | ||
|
Не по теме:
http://www.robbayer.com/files/serial-win.pdf и вообще в оффтоп уже ушли))
1
|
||
| 14.10.2011, 14:50 | |
|
0
|
|
| 14.10.2011, 16:25 | |
|
Не по теме: lifestyle, и что, это работает и с дисковыми файлами? А если нет чтения/записи, например, интенсивные вычисления?
0
|
|
|
2 / 2 / 1
Регистрация: 24.03.2010
Сообщений: 121
|
|||||||
| 14.10.2011, 18:53 [ТС] | |||||||
|
Переправил на CTablicaDlg *pDlg = (CTablicaDlg *)Param, но скомпилилась только после написания слова "public" перед самой функцией в классе (хотя она и так была public, странно). Теперь при выполнении FillGrid() вылезает debug assertion failed. Упрощенный код этой функции (с пометкой места ошибки) ниже:
Еще один момент. FillGrid() вызывается не 1 раз, т.е. 9000 проходов делаются не сразу. Получается, что каждый раз при обращении к FillGrid() будет создаваться новый поток.
0
|
|||||||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
|
| 14.10.2011, 19:04 | |
|
назовите мне разницу между слипом и таймаутом (не на уровне академической науки, а на уровне прикладника)задача одна и та же отобрать у процесса время
слип это не типа цикл задержка на скоко-то секунд слип он и есть слип(уснуть) а не задержка (делай)
0
|
|
|
Mobile Developer
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
|
|||||||
| 14.10.2011, 19:23 | |||||||
|
Простенький пример реализации...
а таймаут ,в случае с ком портом расмотренный выше пример, на протяжении которого поток пытается считать данные и если таймаут исчерпан чтение заканчивается и продолжается дальше т.е. ReadFile возвращает управление потоку даже если ничего не было прочитано с порта по истечении таймаута...
1
|
|||||||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
|
||
| 14.10.2011, 19:38 | ||
|
а не понятно о чем речь! навскидку обратными функциями (цал бэк) могут быть только статические или глобальные функции оно и понятно объектов может быть до проха а а функция должна быть в памяти одна (иначе куда системе передавать управление) посему статическая функция не имеет доступа к элементам класса х=0 к какому х мы обращаемся нужно писать так this->x=0 обрашение к переменной х текущего элемента извините если объяснил сумбурно
0
|
||
| 14.10.2011, 19:38 | |
|
Помогаю со студенческими работами здесь
20
Принудительный выход из цикла foreach Принудительный выход из программы Принудительный выход из метода Принудительный выход из прерывания на СИ Принудительный выход из программы не работает Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|