Сообщение Re[5]: Как вызвать метод формы из родительского потока? от 18.09.2014 9:47
Изменено 18.09.2014 9:48 Danchik
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Danchik, Вы писали:
D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.
Тогда так:
D>Здравствуйте, Danchik, Вы писали:
D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>>_thread.Interrupt();
D>>>_thread.Join(Int32.MaxValue);
D>>>
D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.
Тогда так:
public class ThreadUIClass1 : IDisposable
{
private Form _form;
private Thread _thread;
public void Dispose()
{
TerminateThread();
}
private void TerminateThread()
{
if (_thread != null)
{
var form = _form;
if (form != null && form.IsHandleCreated)
form.Invoke((MethodInvoker) (() => _form.Close()));
_thread.Join(Int32.MaxValue);
_thread = null;
}
}
public void RunThread()
{
_thread = new Thread(RunApp);
_thread.Start();
}
private void RunApp(object obj)
{
_form = new Form();
try
{
Application.Run(_form);
}
finally
{
_form.Dispose();
_form = null;
}
}
}
Re[5]: Как вызвать метод формы из родительского потока?
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Danchik, Вы писали:
D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.
Тогда так:
D>Здравствуйте, Danchik, Вы писали:
D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>>_thread.Interrupt();
D>>>_thread.Join(Int32.MaxValue);
D>>>
D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.
Тогда так:
public class ThreadUIClass1 : IDisposable
{
private Form _form;
private Thread _thread;
public void Dispose()
{
TerminateThread();
}
private void TerminateThread()
{
if (_thread != null)
{
var form = _form;
if (form != null && form.IsHandleCreated)
form.Invoke((MethodInvoker) (() => form.Close()));
_thread.Join(Int32.MaxValue);
_thread = null;
}
}
public void RunThread()
{
_thread = new Thread(RunApp);
_thread.Start();
}
private void RunApp(object obj)
{
_form = new Form();
try
{
Application.Run(_form);
}
finally
{
_form.Dispose();
_form = null;
}
}
}