11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
|
1 | |
Как закрыть приложение, которое находится в процессе выполнения алгоритма?31.08.2017, 12:12. Показов 2190. Ответов 30
Метки нет (Все метки)
Привет!
В программе используется алгоритм преобразования строковых данных. Этот процесс может длиться пару суток. В Процедуру которая выполняет этот алгоритм передается переменная, с помощью которой можно продолжить работу с последнего места. Данные автоматически сохраняются каждые 10 минут и при выходе из программы. Когда нажимаю кнопку выйти во время выполнения алгоритма, выход из программы не происходит, алгоритм продолжает выполняться. Как сделать чтобы можно было выйти из программы в любой момент времени? Если можно без "многопоточности" или скажите что это не так страшно и как делать)
0
|
31.08.2017, 12:12 | |
Ответы с готовыми решениями:
30
Как создать приложение, которое невозможно закрыть даже завершая процесс Как запустить приложение, которое находится в той же директории, что и собранная программа? Создать приложение, которое нельзя закрыть Приложение находится в режиме приостановки выполнения |
Житель Земли
|
|
31.08.2017, 13:01 | 2 |
Сообщение было отмечено vino0s как решение
Решение
ты должен завести флаг "нажата кнопка" и присвоить ему true
должен периодически проверять флаг "нажата кнопка" (если это цикл, то в каждой итерации цикла) и если он равен true, прерывать работу
1
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
|
31.08.2017, 13:06 [ТС] | 3 |
Ага всё шикарно, только у меня процедура не принадлежит TForm: тогда с флагом не получится, я полагаю. Есть ли решение для таких случаев?
Ну я конечно просто изменю процедуру на TForm. Спасибо!
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
|||||||||||
31.08.2017, 13:51 [ТС] | 5 | ||||||||||
Хз, разве я смогу обратиться к глобальной переменной в "не глобальной функции"?
Или как тут можно сделать? Добавлено через 1 минуту ну вот к слову эта функция вызывается один раз, и дальше погружается в процесс. Если бы я ее к примеру вызывал часто, тогда можно было бы передавать параметром closebool. Добавлено через 15 минут Может я просто не понимаю алгоритм работы функций/процедур. Скажем если я передал параметр глобальной (Формы) переменной, то во время выполнения работы я могу на них повлиять, Если сами функции не описаны в классе Формы?
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
||||||
31.08.2017, 13:55 [ТС] | 7 | |||||
Чет не получилось)
0
|
Житель Земли
|
||||||
31.08.2017, 13:58 | 8 | |||||
говорю же - в цикле!
это один из многих вариантов
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
|||||||||||
31.08.2017, 16:16 [ТС] | 9 | ||||||||||
Я спорить не буду, но вроде тот пример что выше предложил имеет такую же силу)
Сейчас проверю, тут просто каждый внешний цикл занимает около 5 минут. А вложенный достаточно быстр (сек 5-10). Хотелось бы прерываться на вложенном. Добавлено через 5 минут В общем для начала о самом "выходе" - ваша реализация работает. Но если убрать те строчки, что добавил я - то не работает. А теперь о самом сочном, о самой процедуре - она теперь не выполняет свою работу... =) Добавлено через 2 минуты тот процесс который выполнялся 5 минут выполняется за 5 секунд)) Добавлено через 1 минуту
Вопрос открытый. Реализация выхода решена, в ущерб самой функции) Что естественно не радует) Почему он стал пропускать выполнение "долгой" обработки и начал строчить как с пулемета? Добавлено через 58 минут да не и сама муть даже эта не верно выстроена. Надо добавлять еще один флаг на окончание работы функции. Добавлено через 1 минуту
0
|
31.08.2017, 17:09 | 11 |
вот конкретно в этом коде нужно применять правильные названия переменных, отвязку интерфейса от логики и выделение логических блоков кода в отдельные процедуры
после этого прямо все станет ясно
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
|||||||||||
31.08.2017, 18:36 [ТС] | 12 | ||||||||||
Очень ценный совет) Но пока я не добавил while do все работало и без правильных названий переменных, и логических блоков. Если я отвяжу интерфейс, то 2 суток смотреть и думать происходит что то, верно ли все происходит или все уже законченно не айс...
Там у меня большой список заменился на малый, поэтому все стало летать быстро Добавлено через 8 минут
Добавлено через 4 минуты наверное правильное было все таки) Крч снова не закрывается) Добавлено через 8 минут закрывается через несколько итераций Добавлено через 48 минут на этой же итерации, но вложенный доходит до конца (5 мин) Добавлено через 1 минуту ага, увидел косяк, условие не в цикле for. Добавлено через 10 минут Вот рабочий вариант, для моего случая.
Теперь можно поговорить о философии кода) Вот конкретно на эту тему. Что вы имели ввиду? Имена я естественно менять не буду, ибо они уже в голове пропечатаны. А вот про MVC модель и логические блоки, по подробнее, пожалуйста)) Конкретно для этого кода.
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
|||||||||||||||||||||
31.08.2017, 19:01 | 13 | ||||||||||||||||||||
Подозреваю что суть в том, что Break прерывает выполнение короткого цикла, а на длинном куске break теряется в ветвлениях.
Как вариант переделать на безальтернативный вариант как уже предложили
Ну или (прям уже чую как прицельным огнем полетели тапки) использовать Goto, тут все вообще может быть прекрасно. Завели отдельный кусок кода который сохранит все что надо и переходите на него вместо break'а
Хинт: кусок кода с 22 строки
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
||||||
31.08.2017, 19:43 [ТС] | 15 | |||||
Да вроде не вызывается, второе условие вообще один раз за все время процедуры выполнится, а именно в конце. И похожесть она моментальная можно сказать, там просто 2 "слова" сравнивается по алгоритму N-грамм.
Вся попа (5 мин) начинается когда идет обработка списка 80к строк: каждая строка состоит от 2-х до 7-ми слов, каждую строку разбиваем на слова, ищем совпадение по списку замены ( от 1 до 4-х слов), и если есть совпадение заменяем слово, затем собираем строку. и идем дальше. Ну можно тут задачку на подумать написать)) Если есть желание у кого-то решить, я буду рад)) Начальные параметры: Список фраз ( отсортирован по количеству слов в строке: от 2-х до 7-ми, слова в каждой строке отсортированы по алфавиту a-z,а-я) = в коде М2, Список различных слов, которые могут встретиться в М2 ( по одному слову в строке, отсортированы по алфавиту ) = в коде М, Список слов замены (формируется через функцию Pohozhest) = в коде Mr. Задача: Заменить похожие слова в Списке фраз М2. Алгоритм: 1) Выявляем различные слова из списка М2 => М (это уже сделано заранее, процесс тоже довольно длительный, есть оптимизация, к задаче не относится) 2) Проходим по Списку различных слов М и заполняем Список замен Mr, пока выполняется Pohozhest (здесь все таки придется изменить на полный обход списка различных слов, но пока так...) Первое "слово" является словом для замены, фиксируем его в переменную vr и удаляем из Списка замен. 3) Проходим по Списку фраз 3.а) каждую строку разбиваем на слова (НУЖНО чтобы не заменялось слово "БЕЗДНА" на слово "БЕЗ" к примеру, если не понятно, в общем на слова разбиваться нужно! ) 3.б) сравниваем каждое слово на совпадению по Списку замен 3.в) если находим заменяем Идея: Сортировка по количеству слов, достаточно быстрая ( в сравнении с двумя сутками ) можно сократить время сокращая количество строк в списке фраз, Если список фраз отсортировать по алфавиту, а каждая строка также отсортирована по алфавиту, тогда, к примеру, проходя слово на букву М, будем проходить список фраз от А до буквы Н, конечно при букве Я придется пройти весь список, но для буквы А, все кончится довольно скоро (До Б) Если есть Идеи пишите) Добавлено через 1 минуту Они возникли когда я захотел выходить из программы во время выполнения этих долгих (2 суток) алгоритмов, и чтоб сохранялся уровень прохода, а то когда через диспетчер отрубаешь, сохранение уровня прохода не происходит) Добавлено через 4 минуты Так а по поводу Goto: у меня таких функций и процедур, которые могут длиться от часа до нескольких суток, несколько) Их я уже привел к TForm, было бы не плохо путем "вставления" небольшого когда добиваться результата (т.е. не несколько строчек вставлять в начало, конец и середину, а небольшой блок, в конец например) Вот у меня чутьё что это Goto может помочь))) Хотелось бы узнать о подводных камнях с этим оператором, по части памяти, ну и вообще. Добавлено через 2 минуты да и вообще может есть готовый быстрый велик по описанной задаче? Добавлено через 7 минут вообще в голове зародилась таблица из 7 столбиков, вот я код находил:
0
|
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
|
||||||
31.08.2017, 23:31 | 16 | |||||
Каждый кусок кода выполняет свою работу, даже в пределах одной процедуры можно выделить несколько блоков. Например подготовка данных, непосредственно работа с ними, вывод результатов и т.д.
По мере роста обьема кода вполне логично разделить процедуру на другие, более мелкие, процедуры, которые выполняют только свою определенную роль. Это проще как в написании кода, так и в отладке - найти ошибку в 3 строках кода, легче чем найти ошибку на 3 страницах. Конкретно в вашем случае лично я вижу два куска кода которые вообще дублируются, и могут быть заменены на локальные процедуры. Кликните здесь для просмотра всего текста
По поводу оптимизации алгоритма вопрос есть. Как обрабатываются варианты склонений? Тоесть "бездна" и "бездной" это разные или одинаковые слова? Как вариант (который с вероятностью 99% будет отброшен): Кликните здесь для просмотра всего текста
1. создать базу слов: одно слово = одно число. База может быть общей и пополняемой это ее несомненный плюс - нет необходимости создавать ее при каждом запуске и т.д.
2. Входной текст преобразуем в массив чисел соответствующим словам в базе. 3. Всю работу что вы описали для слов производим для массива чисел. 4. Преобразуем числа в слова. Не смотря на ужас от обьема работы есть один несомненный плюс - поиск, сравнение, замена числа в массиве происходит в сотни раз быстрее чем работа со строками. Если верить гуглу в русскоя языке 131 257 общеупотребимых слов, поэтому поиск по базе обещает быть очень быстрым. Но вопрос в том, сумеем ли привести слова в тексте к начальной форме? С Goto есть только одна проблема - с памятью. Памятью программиста Мы можем выйти из середины всех циклов, не удалить обьекты или наоборот удалить, а затем вернуться в место где они (обьекты) используются. Все это надо помнить при работе с Goto. Некоторые критикуют за использование Goto. Но что бы не говорили, большинство кода это линейные куски которые выполняются строчка за строчкой. Циклы и условные операции вносят разнообразие давая 'вторую координату'. Процедуры и функции только заменяют несколько строк одной, но опять на линейность не особо влияют. Goto рвет шаблон, лихо заворачивая простыню кода, соединяя ее "червоточинами". И вот с этой "мятой простыней" и придется иметь дело. Готовы вы на этот подвиг/безумство или нет решать только вам. IMHO.
1
|
пофигист широкого профиля
4753 / 3188 / 861
Регистрация: 15.07.2013
Сообщений: 18,450
|
|
01.09.2017, 01:50 | 17 |
Ну не совсем так. Мы можем вполне грамотно выйти из "середины" любого цикла из без GoTo точно также позабыв освободить память. Но мы никак, кроме GoTo не можем войти внутрь любого цикла. А войдя в него таким наглым образом мы уже никак не можем ничего контролировать, ни память, ни значения переменной цикла.
Ну в общем и целом ответ такой - использовать GoTo никем не запрещено. А иногда его использование позволяет сделать исходник наиболее компактным и следовательно более понятным на взгляд. Но в этом случае нужно твердо помнить, что компилятор Дельфи(Паскаля) нам тут ничем не может помочь в плане подсказки о неверных переходах. Так что всё должны контролировать мы сами.
1
|
Animalia
|
|||||
01.09.2017, 06:17
#18
|
|||||
Не по теме: Очень даже можем. Главное 'грамотно' войти, а в остальном согласен. Кликните здесь для просмотра всего текста
0
|
11 / 11 / 8
Регистрация: 26.03.2014
Сообщений: 400
|
||||||
01.09.2017, 07:55 [ТС] | 19 | |||||
Есть еще 9 процедур, таких же долгих, и для них используется тот же TProgressBar, в этом случае выкидывать не нужно?
Добавлено через 1 минуту и вот в подпроцедуре, я не особо понял, мы же StartFrom ни как не возвращаем или я чего-то не понимаю?) Добавлено через 1 минуту Это ладно понял, нашел ниже) Добавлено через 1 минуту нет она используется когда Pohozhest не True Добавлено через 1 минуту Но в целом понял конечно) Любой повторяющийся код надо приводить к функции/процедуре. Только со СтартФром подробнее) По-моему оно не сработает Добавлено через 2 минуты Ну как Pohozhest решит) смотря какие параметры в нее передать) Процент совпадения Sov, и минимальная длина слова DlSl. На установленных - да, одинаковые. Добавлено через 16 минут Ну если заморочиться можно через Яндекс.Словарь начальную форму выцыганить) Или с Pohozhest`ю поколдовать, что в принципе как задача висит. Ваш способ вроде "Хешированием" называется. Читал такое. А что ужасного-то? ) А вот это преобразование не будет ли долгим? В дальнейшей работе конечно огонь! Сколько бит на фразу под число выделить... (17бит +1 запасом 18^2= 262144) т.е. числа будут 123456789123456789 вот такой длины. И как строка с предложением будет выглядеть? "Доброе утро" если слова "Доброе" = 123456789123456788, "утро" = 123456789123456789 имеют такие значения. Тут вот я не понял крч. Если конечно как сам писал заливать Список фраз в таблицу с 7-мью столбцами, то и каждое число будет в своей ячейке, тогда все будет летать. А в другом случае, как мне кажется, строка останется строкой только вид ее будет из чисел) Да и так 10к строчек в голове держу, какая разница, если добавить БыстрыеПереходы) Тут тогда такой вопрос:
Добавлено через 2 минуты на второй итерации все равно будет -4? или 0? или 1? )))
0
|
01.09.2017, 09:06 | 20 |
а есть словесное описание процесса?
чаще всего оно является достаточным для проектирования "сверху вниз" сначала описываем большие куски - процедуры потом в каждой процедуре более конкретно и так до конца. получается нормальная стройная структура а вместо любого goto отлично работает Exception причем есть "тихие" exception типа EAbort
0
|
01.09.2017, 09:06 | |
01.09.2017, 09:06 | |
Помогаю со студенческими работами здесь
20
Написать приложение (с использованием семафора), которое не дает закрыть любой exe файл, пока запущено Отладка WPF приложения. Приложение находится в режиме приостановки выполнения Как закрыть поток в чужом процессе зная адрес этого потока Как закрыть поток в чужом процессе зная адрес этого потока Как можно завершить программу в процессе её выполнения Как сделать, чтобы программа не зависала в процессе выполнения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |