Здравствуйте, AngeL B., Вы писали:
AB>Здравствуйте, slavenin137, Вы писали:
S>>if (имя_формы.DialogResult == DialogResult.Cancel) S>>{ S>> // остановить код!!!!! срочно!!! S>>}
AB>Можно все таки более пространно о том, что значит "останосить код!!!"? AB>Какой код надо остановить? AB>На сколько его надо остановить? AB>Остановить(приостановить) или прервать(завершить)? AB>Код находится в текущем потоке или в другом?
хм...
1 — отсановить код главной формы.
2 — надо завершить операцию.
3 — да код находиться в текущем потоке
Здравствуйте, stump, Вы писали:
S>Здравствуйте, slavenin137, Вы писали:
S>>>>запустил форму — в ней происходит выполнения кода после нажатия кнопки. при определенных обстоятельствах выскакивает вторая форма с двумя кнопками ок и отмена. если нажал ок — то все пошло дальше — если нажал отмена — то главная форма остается открытой и бездействует, а вспомогательная формочка закрывается.
S>>я пытаюсь максимально подробно описать — извините если пудрю мозги)) S>>дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при: S>>if (имя_формы.DialogResult == DialogResult.Cancel) S>>{ S>> // остановить код!!!!! срочно!!! S>>} S>>такого метода — ShowModal я не нашел в с#...
S>Судя по постановке вопроса, вы не в курсе того что такое message loop. S>В вашем коде достаточно поставить return и ваша форма будет "бездействовать". Т.е. она не будет выполнять никакого кода, написанного вами, и в тоже время не будет "виснуть намертво". S>
Здравствуйте, AngeL B., Вы писали:
AB>Здравствуйте, slavenin137, Вы писали:
S>>мужики))) я конечно начинающий пользователь — но не до такой же степени))) S>>как сделать так чтобы форма бездействовала после нажатия отметы?
AB>ты хочешь сказать, что у тебя форма _сама_по_себе_ что-то делает после нажатия отмены?
Да! она продолжает выполнять вычисления — которые надо немедленно остановить.
Здравствуйте, slavenin137, Вы писали:
S>Здравствуйте, AngeL B., Вы писали:
AB>>ты хочешь сказать, что у тебя форма _сама_по_себе_ что-то делает после нажатия отмены?
S>Да! она продолжает выполнять вычисления — которые надо немедленно остановить.
Здравствуйте, slavenin137, Вы писали:
S>нет ретурн не подходит... S>процесс происходит в функции которая возвращает List<...>
Ага, понятно. Надо откатить стек вызовов до определенного места и вернуться в message loop.
Тогда try/catch там где начало кода и throw где его надо прервать. Желательно сделать специальный тип исключения для ентого.
А вообще такой подход к реализации у меня считается плохой алгоритмической конструкцией. В данном случае почти однозначно можно рефакторить код так, чтобы все работало через обычные if. мое мнение.
S>>Судя по постановке вопроса, вы не в курсе того что такое message loop. S>>В вашем коде достаточно поставить return и ваша форма будет "бездействовать". Т.е. она не будет выполнять никакого кода, написанного вами, и в тоже время не будет "виснуть намертво". S>>
S>> S>нет ретурн не подходит... S>процесс происходит в функции которая возвращает List<...>
Ну так и возвращай то что успел накидасть в свой лист.
Но я полагаю, что ты хочешь приостановить формирование своего листа, а потом "по кнопочке" продолжить черное дело. Так?
Тогда тебе надо много мануалов читать. Например про BackgroundWorker. И промногопоточное программирование вообще.
В твоем случае формировать лист надо было в отдельном потоке, а окошки выбрасывать в главном потоке, синхронизируя при этом оба потока при помощи сообщений и примитивов синхронизации, например ManualResetEvent. Если все это слишком сложно, попробуй BackgroundWorker.
Здравствуйте, AngeL B., Вы писали:
AB>Здравствуйте, slavenin137, Вы писали:
S>>нет ретурн не подходит... S>>процесс происходит в функции которая возвращает List<...>
AB>
AB>return null;
AB>
AB>что тоже не подходит?
offtop: Плохой стиль. возвращать null для коллекций. FxCop ругаться будет
Здравствуйте, samius, Вы писали:
S>Здравствуйте, slavenin137, Вы писали:
S>>интересно как ShowDialog остановит код после нажатия кнопочки отмена у дочерней формы...
S>Иронизируете? 3-я страница, а несколько человек, которые в дотнете не первый год, не могут понять, что вы хотите?!?!?
я приношу извинения за свои неясные объяснения... но ShowDialog все равно не в тему)))
Здравствуйте, slavenin137, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>Иронизируете? 3-я страница, а несколько человек, которые в дотнете не первый год, не могут понять, что вы хотите?!?!? S>я приношу извинения за свои неясные объяснения... но ShowDialog все равно не в тему)))
Что-то мне подсказывает, что мы со своими догадками далеки от того что происходит в той форме. Во всяком случае, кусок кода все здорово бы прояснил. (поздновато уже, телепаты отдыхают).
Здравствуйте, slavenin137, Вы писали:
S>>>интересно как ShowDialog остановит код после нажатия кнопочки отмена у дочерней формы...
S>>Иронизируете? 3-я страница, а несколько человек, которые в дотнете не первый год, не могут понять, что вы хотите?!?!? S>я приношу извинения за свои неясные объяснения... но ShowDialog все равно не в тему)))
Может Debug.Assert(false) подойдет, можно одним нажатием попасть в отладчик.
Здравствуйте, slavenin137, Вы писали:
S>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
Сама постановка задачи противоречивая. С одной стороны, ты хочешь, чтобы код не выполнялся, а с другой — чтобы обрабатывался клик на кнопке. Второе невозможно, если никакого кода не выполняется, т.к. должен выполняться хотя бы цикл выборки оконных сообщений.
Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось? S>т.е. S>... S>... S>if (...) { СТОП!; }
Правильно ли я понимаю, что происходит следующее:
1. по какому-то событию (я так понял по нажатию на конопку) запускается обработчик события (назовём его eventHandler)
2. внутри него вызывается какая-то функция которая может работать долго (назовём её longRunningFunc)
3. в функции longRunningFunc ( или в какой-то функции A, которая прямо или непрямо вызывается из longRunningFunc) по какому-то условию показывается диалог, который спрашивает, что-то вроде "остановить процес?"
4. если пользователь говорит "я буду мужественно ждать", ничего не происходит — longRunningFunc и дальше продолжает заполнять список
5. если же пользователь выбрал вариант "с меня хватит", то мы должны завершить longRunningFunc и eventHandler.
Если всё вышенаписаное приблизительно так и есть, то для получения нужного еффекта без существенных переделок нужно
1. создать класс AbortLongRunningFuncException
2. вызов longRunningFunc в eventHandler-e заключить в try/catch вот так
Здравствуйте, KRA, Вы писали:
KRA>Здравствуйте, slavenin137, Вы писали:
S>>Добрый день! S>>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось? S>>т.е. S>>... S>>... S>>if (...) { СТОП!; }
KRA>Думаю, что правильный ответ прозвучал
. Я лишь немного уточню.
KRA>Правильно ли я понимаю, что происходит следующее: KRA>1. по какому-то событию (я так понял по нажатию на конопку) запускается обработчик события (назовём его eventHandler) KRA>2. внутри него вызывается какая-то функция которая может работать долго (назовём её longRunningFunc) KRA>3. в функции longRunningFunc ( или в какой-то функции A, которая прямо или непрямо вызывается из longRunningFunc) по какому-то условию показывается диалог, который спрашивает, что-то вроде "остановить процес?" KRA>4. если пользователь говорит "я буду мужественно ждать", ничего не происходит — longRunningFunc и дальше продолжает заполнять список KRA>5. если же пользователь выбрал вариант "с меня хватит", то мы должны завершить longRunningFunc и eventHandler.
KRA>Если всё вышенаписаное приблизительно так и есть, то для получения нужного еффекта без существенных переделок нужно KRA>1. создать класс AbortLongRunningFuncException KRA>2. вызов longRunningFunc в eventHandler-e заключить в try/catch вот так
KRA>