Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось? S>т.е. S>... S>... S>if (...) { СТОП!; }
Устроить deadlock )))
Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось?
System.Environment.FailFast(null);
или
System.Diagnostics.Process.GetCurrentProcess().Kill(); // требует ссылки на System.dll
Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось?
Еще есть способы:
1)
System.Environment.Exit(0);
но при этом будут выполняться финализаторы (но не finally блоки)
2)
System.Threading.Thread.CurrentThread.Abort();
прерывается только текущий поток, блокм finally выполняются.
Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось?
Ну и наконец, если надо остановить выполнение кода, а не прервать его, то можно использовать
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, slavenin137, Вы писали:
S>>Добрый день! S>>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось?
N>Еще есть способы:
N>1) N>
N>System.Environment.Exit(0);
N>
N>но при этом будут выполняться финализаторы (но не finally блоки)
N>2) N>
N>выгружает целиком домен приложения, прерывая все потоки в нем, но не может использоваться в основном домене.
nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, slavenin137, Вы писали:
S>>Добрый день! S>>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось?
N>Ну и наконец, если надо остановить выполнение кода, а не прервать его, то можно использовать
N>
N>System.Threading.Thread.Sleep(-1);
N>
при использовании данного способа программа виснет наглухо..
посоветуйте ещё что нибудь.. пока что ни что не подходит...
Здравствуйте, slavenin137, Вы писали:
S>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
Может быть, тогда лучше поместить этот код в обработчик события кнопки?
Здравствуйте, slavenin137, Вы писали:
S>при использовании данного способа программа виснет наглухо.. S>посоветуйте ещё что нибудь.. пока что ни что не подходит...
Если нужно управлять взаимодействием нескольких потоков (один поток ждет, пока другой сделает что-нибудь), то нужно смотреть классы:
System.Threading.Monitor
System.Threading.ReaderWriterLock
System.Threading.ReaderWriterLockSlim // в сборке System.Core.dll
System.Threading.WaitHandle
System.Threading.ManualResetEvent
System.Threading.AutoResetEvent
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, slavenin137, Вы писали:
S>>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
N>Может быть, тогда лучше поместить этот код в обработчик события кнопки?
нет, так не надо...
запустил форму — в ней происходит выполнения кода после нажатия кнопки. при определенных обстоятельствах выскакивает вторая форма с двумя кнопками ок и отмена. если нажал ок — то все пошло дальше — если нажал отмена — то главная форма остается открытой и бездействует, а вспомогательная формочка закрывается.
Здравствуйте, slavenin137, Вы писали:
S>Здравствуйте, nikov, Вы писали:
N>>Здравствуйте, slavenin137, Вы писали:
S>>>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
N>>Может быть, тогда лучше поместить этот код в обработчик события кнопки? S>нет, так не надо... S>запустил форму — в ней происходит выполнения кода после нажатия кнопки. при определенных обстоятельствах выскакивает вторая форма с двумя кнопками ок и отмена. если нажал ок — то все пошло дальше — если нажал отмена — то главная форма остается открытой и бездействует, а вспомогательная формочка закрывается.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, slavenin137, Вы писали:
S>>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
N>Может быть, тогда лучше поместить этот код в обработчик события кнопки?
сдается мне, что человек под выполнением кода понимает нечто другое.
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, slavenin137, Вы писали:
S>>Здравствуйте, nikov, Вы писали:
N>>>Здравствуйте, slavenin137, Вы писали:
S>>>>nikov, описанные вами методы полностью закрывают программу, а как сделать так чтобы форма оставалась на экране — но код не выполнялся — а начинал выполняться только при нажатии button
N>>>Может быть, тогда лучше поместить этот код в обработчик события кнопки? S>>нет, так не надо... S>>запустил форму — в ней происходит выполнения кода после нажатия кнопки. при определенных обстоятельствах выскакивает вторая форма с двумя кнопками ок и отмена. если нажал ок — то все пошло дальше — если нажал отмена — то главная форма остается открытой и бездействует, а вспомогательная формочка закрывается.
КЛ>сделать второй форме ShowModal? давай конкретнее
я пытаюсь максимально подробно описать — извините если пудрю мозги))
дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при:
if (имя_формы.DialogResult == DialogResult.Cancel)
{
// остановить код!!!!! срочно!!!
}
такого метода — ShowModal я не нашел в с#...
Здравствуйте, slavenin137, Вы писали:
S>я пытаюсь максимально подробно описать — извините если пудрю мозги)) S>дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при: S>if (имя_формы.DialogResult == DialogResult.Cancel) S>{ S> // остановить код!!!!! срочно!!! S>} S>такого метода — ShowModal я не нашел в с#...
Здравствуйте, samius, Вы писали:
S>Здравствуйте, slavenin137, Вы писали:
S>>я пытаюсь максимально подробно описать — извините если пудрю мозги)) S>>дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при: S>>if (имя_формы.DialogResult == DialogResult.Cancel) S>>{ S>> // остановить код!!!!! срочно!!! S>>} S>>такого метода — ShowModal я не нашел в с#...
S>Выйти из цикла чтоли? S>break!
мужики))) я конечно начинающий пользователь — но не до такой же степени)))
как сделать так чтобы форма бездействовала после нажатия отметы?
чтобы просто остановила все процессы — но не закрывалась при этом.
Здравствуйте, slavenin137, Вы писали:
S>if (имя_формы.DialogResult == DialogResult.Cancel) S>{ S> // остановить код!!!!! срочно!!! S>}
Можно все таки более пространно о том, что значит "останосить код!!!"?
Какой код надо остановить?
На сколько его надо остановить?
Остановить(приостановить) или прервать(завершить)?
Код находится в текущем потоке или в другом?
Здравствуйте, slavenin137, Вы писали:
S>Добрый день! S>Скажите пожалуйста как сделать так чтобы при опреденных обстоятельствах выполнение кода преращалось? S>т.е.
А если подробнее, какая именно задача?
полностью остановить весь C# код никто не даст — слишком многое на него уже завязано.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, slavenin137, Вы писали:
S>мужики))) я конечно начинающий пользователь — но не до такой же степени))) S>как сделать так чтобы форма бездействовала после нажатия отметы?
ты хочешь сказать, что у тебя форма _сама_по_себе_ что-то делает после нажатия отмены?
S>чтобы просто остановила все процессы — но не закрывалась при этом.
Здравствуйте, slavenin137, Вы писали:
S>>>запустил форму — в ней происходит выполнения кода после нажатия кнопки. при определенных обстоятельствах выскакивает вторая форма с двумя кнопками ок и отмена. если нажал ок — то все пошло дальше — если нажал отмена — то главная форма остается открытой и бездействует, а вспомогательная формочка закрывается.
S>я пытаюсь максимально подробно описать — извините если пудрю мозги)) S>дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при: S>if (имя_формы.DialogResult == DialogResult.Cancel) S>{ S> // остановить код!!!!! срочно!!! S>} S>такого метода — ShowModal я не нашел в с#...
Судя по постановке вопроса, вы не в курсе того что такое message loop.
В вашем коде достаточно поставить return и ваша форма будет "бездействовать". Т.е. она не будет выполнять никакого кода, написанного вами, и в тоже время не будет "виснуть намертво".
if (имя_формы.DialogResult == DialogResult.Cancel)
{
// остановить код!!!!! срочно!!!return;
}
Здравствуйте, 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>
Здравствуйте, slavenin137, Вы писали: KRA>>Правильно ли я понимаю, что происходит следующее: KRA>>1. по какому-то событию (я так понял по нажатию на конопку) запускается обработчик события (назовём его eventHandler) KRA>>2. внутри него вызывается какая-то функция которая может работать долго (назовём её longRunningFunc) KRA>>3. в функции longRunningFunc ( или в какой-то функции A, которая прямо или непрямо вызывается из longRunningFunc) по какому-то условию показывается диалог, который спрашивает, что-то вроде "остановить процес?" KRA>>4. если пользователь говорит "я буду мужественно ждать", ничего не происходит — longRunningFunc и дальше продолжает заполнять список KRA>>5. если же пользователь выбрал вариант "с меня хватит", то мы должны завершить longRunningFunc и eventHandler.
S>а ещё на меня тут бочку катили что я плохо объяснил))) Вот! пришел человек и все правильно понял! S>спасибо огромное=)
И правильно катили, т.к. правильно изложил ваши пожелания он, а не вы. Помните, что хороший вопрос должен содержать в себе половину ответа.
P.S. Кажется в теме проскакивало что-то типа: "Телепаты сейчас спят", тебе просто повезло, что один из телепатов проснулся
... << RSDN@Home 1.2.0 alpha rev. 775>>
Re[7]: полная_остановка_кода_С#
От:
Аноним
Дата:
02.10.08 12:34
Оценка:
Здравствуйте, slavenin137, Вы писали:
КЛ>>сделать второй форме ShowModal? давай конкретнее
S>я пытаюсь максимально подробно описать — извините если пудрю мозги)) S>дело в том что вспомогательная форма вызывается в цикле из главной формы — так как сделать так что бы при: S>if (имя_формы.DialogResult == DialogResult.Cancel) S>{ S> // остановить код!!!!! срочно!!! S>} S>такого метода — ShowModal я не нашел в с#...
В С# для форм есть метод ShowDialog!!! При вызове дочерней формы таким образом — главная форма ждет(не выполняет код) пока дочерняя не зароиться!!!!