На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Модальная форма
    Есть форма, которая запускает поток и в потоке отображает изменяющиеся часы часы.
    Она отображается, когда например происходят долгие вычисления.

    ExpandedWrap disabled
      /* -------------------------------------------------------------------------- */
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Threading;
      using System.Text;
      using System.Windows.Forms;
      /* -------------------------------------------------------------------------- */
      namespace mcl
      {
          public partial class WaitForm : Form
          {
              /* ------------------------------------------------------------------ */
              private static int m_index = 0;
              private static WaitForm m_form = null;
              private static Thread m_thread = null;
              private static String m_message;
              /* ------------------------------------------------------------------ */
              private WaitForm ()
              {
                  InitializeComponent();
                  MessageLabel.Text = m_message;
              }
              /* ------------------------------------------------------------------ */
              public static void show(String message)
              {
                  m_index = 0;
                  m_message = message;
                  ThreadStart start = new ThreadStart (run);
                  m_thread = new Thread (start);
                  m_thread.Start();
                  Thread.Sleep(1000 /*2000*/);
              }
              /* ------------------------------------------------------------------ */
              public static void close()
              {
                  m_form.Invoke(new EventHandler(m_form.Close));
                  m_form.Dispose();
              }
              /* ------------------------------------------------------------------ */
              private static void run ()
              {
                  m_form = new WaitForm ();
                  Application.Run(m_form);
              }
              /* ------------------------------------------------------------------ */
              private void WaitForm_Load(object sender, EventArgs e)
              {
                  int screenWidth = Screen.PrimaryScreen.Bounds.Width;
                  int screenHeight = Screen.PrimaryScreen.Bounds.Height;
                  int x = (screenWidth - this.ClientSize.Width) / 2;
                  int y = (screenHeight - this.ClientSize.Height) / 2;
       
                  this.Location = new Point(x, y);
                  this.Timer.Enabled = true;
              }
              /* ------------------------------------------------------------------ */
              private void Close(object sender, EventArgs e)
              {
                  this.Timer.Enabled = false;
                  this.Close();
              }
              /* ------------------------------------------------------------------ */
              private void Timer_Tick(object sender, EventArgs e)
              {
                  int count = ClockImages.Images.Count;
                  PictureBox.Image = ClockImages.Images[m_index++ % count];
              }
              /* ------------------------------------------------------------------ */
          }
      }
      /* -------------------------------------------------------------------------- */


    запускается форма так
    ExpandedWrap disabled
      WaitForm.show("Пожалуйста, подождите...");
      // здесь вычисления
      WaitForm.close();
      Application.DoEvents();


    1. форма почему-то не работает без Thread.Sleep(1000) - почему
    2. если приложение слетает или принудительно закрывается, то основная форма закрывается,
    а эта иногда нет. Странно - разве процесс не должен почистить все за собой.

    P.S. или что я не совсем так делаю

    спасибо
      Цитата zss @
      Странно - разве процесс не должен почистить все за собой.
      нет, порожденные потоки сами по себе не завершаются. нужно принудительно.

      Цитата zss @
      WaitForm.show("Пожалуйста, подождите...");
      // здесь вычисления
      WaitForm.close();
      Application.DoEvents();
      :rolleyes: имхо, правильней поток порождать не для формы, а для вычислений :whistle:

      Добавлено
      Цитата zss @
      форма почему-то не работает без Thread.Sleep(1000) - почему
      попробуй сделать Application.DoEvents после show
        Цитата archimed7592 @
        нет, порожденные потоки сами по себе не завершаются. нужно принудительно.

        а если аварийное завершение - как быть. Ведь это не логично, что потоки, попрожденные процессом не умирают с процессом


        Цитата archimed7592 @
        имхо, правильней поток порождать не для формы, а для вычислений

        тут не совсем поток, а просто вызов метода, который долго выполняется системой.
        Выполнять его в потоке слишком накладно и слишком много кода получается.
        А так вроде один поток для отрисовки формы :)

        Или все-таки это не правильно

        Добавлено
        Цитата archimed7592 @
        попробуй сделать Application.DoEvents после show

        но если я не ставлю ее после. то она не успевает закрываться и происходит наложение форм
          стоп........... не понял, форма с часиками является модальной, во всяком случае так говориться в заголовке. Тогда не понятно зачем тебе вообще второй поток нужен, ведь при запуске модального окна форма родитель всеравно не доступна. Отсюда следует следующее, перед началом своих вычислений запускаешь свою форму с часиками (тем более что часики с тиками таймера обновляются), а по окончании вычислений закрываешь свои часики. И все! ;)
            Цитата Pit-Bul @
            форма с часиками является модальной, во всяком случае так говориться в заголовке
            в коде там она не совсем модальная ;)
              Цитата Pit-Bul @
              стоп........... не понял, форма с часиками является модальной, во всяком случае так говориться в заголовке

              ну эмитация модальной. Иначе вычисления не удается проводить :)


              Цитата Pit-Bul @
              Отсюда следует следующее, перед началом своих вычислений запускаешь свою форму с часиками (тем более что часики с тиками таймера обновляются), а по окончании вычислений закрываешь свои часики. И все!

              пробовал - почему-то не получилось. может правда не то делал.
              Можно если не сложно тестовый примерчик
                Цитата zss @
                но если я не ставлю ее после. то она не успевает закрываться и происходит наложение форм
                что значит не успевает закрываться?

                Цитата zss @
                Ведь это не логично, что потоки, попрожденные процессом не умирают с процессом
                с процессом - умирают...а ты уверен, что процесс умирает? ;)


                Цитата zss @
                тут не совсем поток, а просто вызов метода, который долго выполняется системой.
                Выполнять его в потоке слишком накладно и слишком много кода получается.
                А так вроде один поток для отрисовки формы
                что за метод такой? отрисовка формы?
                  Цитата archimed7592 @
                  что значит не успевает закрываться?

                  например она еще видна, а другая форма котору я показываю накладывается на нее


                  Цитата archimed7592 @
                  с процессом - умирают...а ты уверен, что процесс умирает?

                  ну думаю что исключение со стеком вызовов и после это... думаю что умирает надежно. в диспетчере процесса точно нет


                  Цитата archimed7592 @
                  что за метод такой? отрисовка формы?

                  если просто показать форму с часиками, то помимо того что они не меняют свое значение, так еще и текст не виден.
                  Я думаю это из-за того что она создается в контексте первичного потока, который производит вычистение. И ее отрисовка не происходит.

                  Поэтому я создаю ее в отдельном потоке
                    Цитата zss @
                    например она еще видна, а другая форма котору я показываю накладывается на нее
                    давай по порядку. в терминах "родительская форма" и "модальная форма", что и когда происходит в таком коде
                    ExpandedWrap disabled
                      WaitForm.show("Пожалуйста, подождите...");
                      Application.DoEvents();
                      // здесь вычисления
                      WaitForm.close();
                      Application.DoEvents();


                    Добавлено
                    Цитата zss @
                    ну думаю что исключение со стеком вызовов и после это... думаю что умирает надежно. в диспетчере процесса точно нет
                    не понятно...если в диспетчере процесса нет, то по идее должны умереть все потоки (поток без процесса вроде как не существует) :whistle:


                    Цитата zss @
                    если просто показать форму с часиками, то помимо того что они не меняют свое значение, так еще и текст не виден.
                    Я думаю это из-за того что она создается в контексте первичного потока, который производит вычистение. И ее отрисовка не происходит.
                    ты скажи, что ты делаешь в своих вычислениях. потому что если их можно делать в отдельном потоке, то лучше делать их именно в нем. если нет, то может быть есть более цивильный способ...
                      Цитата archimed7592 @
                      давай по порядку. в терминах "родительская форма" и "модальная форма", что и когда происходит в таком коде


                      Цитата archimed7592 @
                      WaitForm.show("Пожалуйста, подождите...");
                      Application.DoEvents();

                      отображение модальной и запуск таймера для изменения часов

                      Цитата archimed7592 @
                      // здесь вычисления

                      вызов системного метода на долгое время + свои действия (в родительской форме)


                      Цитата archimed7592 @
                      WaitForm.close();
                      Application.DoEvents();

                      закрытие модальной формы
                        zss, а в чем тогда проблема? :) в какой момент происходит наложение? кто на кого накладывается?
                          Цитата archimed7592 @
                          не понятно...если в диспетчере процесса нет, то по идее должны умереть все потоки (поток без процесса вроде как не существует)

                          а модальные формы существуют - в последний раз 6 штук закрывал :)


                          Цитата archimed7592 @
                          ты скажи, что ты делаешь в своих вычислениях. потому что если их можно делать в отдельном потоке, то лучше делать их именно в нем. если нет, то может быть есть более цивильный способ...

                          ну как минимум это передача и получение даннх через Socket - повлиять на это нельзя. И немного своих действий по анализу

                          Добавлено
                          Цитата archimed7592 @
                          zss, а в чем тогда проблема? в какой момент происходит наложение? кто на кого накладывается?

                          хорошо - попробуйте просто вызвать форму и обновлять в ней что-нибудь при этом производя долгие действия (без потоков и Application.DoEvents).

                          Просто мы наверное не понимаем друг-друга

                          Добавлено
                          P.S. забыл сказать, что это Compact FW 2.0
                          Сообщение отредактировано: zss -
                            Цитата zss @
                            ну как минимум это передача и получение даннх через Socket - повлиять на это нельзя. И немного своих действий по анализу
                            а какие сложности работы с сокетом в другом потоке?

                            Цитата zss @
                            а модальные формы существуют - в последний раз 6 штук закрывал

                            попробуй вместо this.Close(); делать Application.ExitThread ();
                              Цитата archimed7592 @
                              а какие сложности работы с сокетом в другом потоке?

                              у класса десатки методов - и что их в отдельный пок все - слишком сложно :)


                              Цитата archimed7592 @
                              попробуй вместо this.Close(); делать Application.ExitThread ();

                              в контексте потока модальной формы ?
                                Цитата zss @
                                в контексте потока модальной формы ?
                                ну да...только приписочка про compact fw кардинально меняет дело :whistle:

                                Добавлено
                                Цитата zss @
                                у класса десатки методов - и что их в отдельный пок все - слишком сложно
                                не совсем понимаю какие могут быть сложности :) хоть убей...
                                  Цитата archimed7592 @
                                  не совсем понимаю какие могут быть сложности хоть убей...

                                  ну это десятки потоковых методов

                                  просто может в C# можно и проще. но я не знаю как :(

                                  Добавлено
                                  Цитата archimed7592 @
                                  ну да...только приписочка про compact fw кардинально меняет дело

                                  почему - базовые классы теже должны быть
                                    Цитата zss @
                                    почему - базовые классы теже должны быть
                                    Application.ExitThread method
                                    Цитата msdn
                                    Version Information
                                    .NET Framework
                                    Supported in: 3.0, 2.0, 1.1, 1.0
                                    в перечисленном compact fw я не нашел...отсюда вывод, что он это не поддерживает...


                                    Цитата zss @
                                    ну это десятки потоковых методов

                                    просто может в C# можно и проще. но я не знаю как
                                    ну хорошо. какие конкретно сложности? вот ты делаешь sock.Receive или netstream.Read - что изменится, если ты будешь делать это в потоке? приведи конкретный пример...хоть убей, не понимаю...хоть там сотни методов...
                                      Цитата archimed7592 @
                                      ну хорошо. какие конкретно сложности? вот ты делаешь sock.Receive или netstream.Read - что изменится, если ты будешь делать это в потоке? приведи конкретный пример...хоть убей, не понимаю...хоть там сотни методов...


                                      я понимаю так. У главной формы есть класс, работающий с сокетом. Если его метод создает поток и выполняет это в отдельном потоке, то это никак не отразится на время выполнения метода вцелом. Мне как пользователю по-барабану как этот метод работает внутри.

                                      А чтоб это действительно работало в отдельных потоках, то нужно сами методы класса вызывать в отдельном потоке.
                                      А это означает что для каждого метода нужет свой потоковый метод - слишком круто будет :)
                                        стоп, стоп, стоп...значит так, вот вычисления:
                                        ExpandedWrap disabled
                                          void calculate (object wf)
                                          {
                                          try
                                          {
                                          for (int i = 1000000; i != 0; --i)
                                          {
                                              method001 ();
                                              method002 ();
                                              // ...
                                              method099 ();
                                              method100 ();
                                          }
                                          }
                                          finally
                                          {
                                          wf.Invoke (...); // закрываем модальную форму форму
                                          }
                                          }
                                        что я тебе предлагаю:
                                        ExpandedWrap disabled
                                          Thread t = new Thread (this.calculate);
                                          t.Start ();
                                          WaitForm wf = new WaitForm ();
                                          wf.ShowModal ();
                                        что же касается methodXXX - они не должны создавать какие-либо потоки - они работают в контексте того самого потока, который ты создаешь перед showmodal
                                          archimed7592
                                          ты опять не понял

                                          если просто есть класс
                                          ExpandedWrap disabled
                                            public class BaseClient
                                            {
                                               bool m1 (Object1 obj1);
                                               bool m2 (Object2 obj2);
                                               bool m3 (Object3 obj3);
                                               ...
                                               Object1 m4 ();
                                               Object2 m4 ();
                                               Object3 m4 ();
                                            }


                                          их нельзя просто выпольнить в одном потоке. Но это не суть.
                                          я набросал тестовый код. попробуй запусти. Заметь. что цикл не выполняется :)

                                          тоесть его нужно в отдельном потоке.
                                          Если удастся корректо запустить форму и убить ее в любом случае, то остальное дело техники :)

                                          Добавлено
                                          а в твоем случае нужно каждый метод в отдельном потоке запускать. Обрабатывать в немже исключения...
                                          Да как быть если из метода нужно результат получить. Много вопросов :)
                                          Сообщение отредактировано: zss -

                                          Прикреплённый файлПрикреплённый файлmodal.zip (35.96 Кбайт, скачиваний: 197)
                                            Цитата zss @
                                            их нельзя просто выпольнить в одном потоке. Но это не суть.
                                            я набросал тестовый код. попробуй запусти. Заметь. что цикл не выполняется
                                            :huh: ну не хочешь как хочешь - твой выбор ;)

                                            прикрепил. работает как часы.
                                            Прикреплённый файлПрикреплённый файлmodal.zip (15.34 Кбайт, скачиваний: 205)
                                              Цитата archimed7592 @
                                              ну не хочешь как хочешь - твой выбор

                                              да просто хочется проще сделать :)


                                              Цитата archimed7592 @
                                              прикрепил. работает как часы.

                                              что-то не понятно что прикреплено
                                                Если хочется форму в отдельном потоке, то сделай её синглтоном, так сразу исчезнет куча проблем

                                                ExpandedWrap disabled
                                                  class WaitForm(){
                                                  private static WaitForm wf;
                                                  private static Thread wt;
                                                  public static WaitForm(){
                                                  (wt=new Thread(new ThreadStart(MessageLoop())).Start();
                                                  }
                                                  private static void MessageLoop(){
                                                  wf=new WaifForm();
                                                  Application.Run();
                                                  }
                                                   
                                                  private static int count=0;
                                                  public static void show(){
                                                  if(count++==0)
                                                  wf.Invoke(new ThreadStart(wf.Show));
                                                  }
                                                  public static void hide(){
                                                  if(--count==0)
                                                  wf.Invoke(new ThreadStart(wf.Hide));
                                                  }
                                                   
                                                  public static void Init(){};
                                                  public staitc void Destroy(){
                                                  wf.Invoke(new ThreadStart(wf.Close));
                                                  wt.Abort();
                                                  }
                                                  }
                                                   
                                                  ......
                                                   
                                                  public static void Main(){
                                                  WaitForm.Init();
                                                  try{
                                                  тут весь код main который был раньше
                                                  }finally{
                                                  WaitForm.Destroy();
                                                  }
                                                  }
                                                  Цитата zss @
                                                  что-то не понятно что прикреплено
                                                  то что работает :)...взял кусочек из твоего кода и немного добавил из своего...что там не понятно?
                                                    andrey, а чио изменилось-то

                                                    да что-то не совсем я понял код.
                                                    1.В конструкторе формы создается поток. который в потоковой функции опять создает форму...
                                                    2.Зачем Init, если есть show и hide
                                                    3.Да и странный синглетон с открытым конструктором :). Может что-то так
                                                    ExpandedWrap disabled
                                                      class Form
                                                      {
                                                          private static Form m_form = null;
                                                          private Form() {};
                                                          static public Form Object ()
                                                          {
                                                              if (m_form == null)
                                                              {
                                                                  m_form = new Form();
                                                              }
                                                              return m_form;
                                                          }
                                                      }


                                                    Добавлено
                                                    Цитата archimed7592 @
                                                    то что работает ...взял кусочек из твоего кода и немного добавил из своего...что там не понятно?

                                                    а ты сам скачай и посмотри :)
                                                    Сообщение отредактировано: zss -
                                                      Цитата zss @
                                                      а ты сам скачай и посмотри
                                                      скачал, посмотрел, запустил. все работает. по нажатию на button1 вылазят часики, которые идут...где-то через 5 секунд модальная форма закрывается...никаких остаточных эффектов, ничего такого...в принципе работать будет и твой код (из первого поста). твоя проблема в том, что в обработчике FromClose ты вызываешь this.Close...попробуй для обычной формы так сделать - при попытке её закрыть она подвиснет...
                                                        Цитата archimed7592 @
                                                        скачал, посмотрел, запустил. все работает

                                                        а я запустить не могу :)

                                                        сбрось просто исходники - я сварю
                                                          я просто добавил в твой проект (modal.zip) код из первого поста и немного переработал момент закрытия формы.
                                                          ExpandedWrap disabled
                                                            // form1.cs
                                                            using System;
                                                            using System.Collections.Generic;
                                                            using System.ComponentModel;
                                                            using System.Data;
                                                            using System.Drawing;
                                                            using System.Text;
                                                            using System.Windows.Forms;
                                                             
                                                            namespace modal
                                                            {
                                                                public partial class Form1 : Form
                                                                {
                                                                    private Form2 m_form = new Form2();
                                                                    public Form1()
                                                                    {
                                                                        InitializeComponent();
                                                                    }
                                                             
                                                                    private void button1_Click(object sender, EventArgs e)
                                                                    {
                                                                        Form2.show();
                                                                        for (int i = 0; i < 100; i++)
                                                                        {
                                                                            System.Threading.Thread.Sleep(50);
                                                                        }
                                                                        Form2.close();
                                                                    }
                                                                }
                                                            }

                                                          ExpandedWrap disabled
                                                            //form2.cs
                                                            using System;
                                                            using System.Collections.Generic;
                                                            using System.ComponentModel;
                                                            using System.Data;
                                                            using System.Drawing;
                                                            using System.Text;
                                                            using System.Windows.Forms;
                                                            using System.Threading;
                                                             
                                                            namespace modal
                                                            {
                                                                public partial class Form2 : Form
                                                                {
                                                                    private static int index = 0;
                                                                    private static Form2 m_form = null;
                                                                    private static Thread m_thread = null;
                                                                    public Form2()
                                                                    {
                                                                        InitializeComponent();
                                                                    }
                                                             
                                                                    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
                                                                    {
                                                                        this.timer1.Enabled = false;
                                                                    }
                                                             
                                                                    private void Form2_Load(object sender, EventArgs e)
                                                                    {
                                                                        index = 0;
                                                                        timer1.Enabled = true;
                                                                    }
                                                             
                                                                    private void timer1_Tick(object sender, EventArgs e)
                                                                    {
                                                                        label1.Text = "Типа часы: " + (index++ % 4);
                                                                    }
                                                                    public static void show()
                                                                    {
                                                                        ThreadStart start = new ThreadStart(run);
                                                                        m_thread = new Thread(start);
                                                                        m_thread.Start();
                                                                        //Thread.Sleep(1000 /*2000*/);
                                                                    }
                                                                    /* ------------------------------------------------------------------ */
                                                                    private delegate void dlg();
                                                                    public static void close()
                                                                    {
                                                                        
                                                                        m_form.Invoke(new dlg (close_));
                                                                        m_form.Dispose();
                                                                    }
                                                             
                                                                    private static void close_()
                                                                    {
                                                                        m_form.Close();
                                                                    }
                                                             
                                                                    /* ------------------------------------------------------------------ */
                                                                    private static void run()
                                                                    {
                                                                        m_form = new Form2();
                                                                        Application.Run(m_form);
                                                                    }
                                                                    /* ------------------------------------------------------------------ */
                                                                }
                                                            }
                                                            Цитата archimed7592 @
                                                            я просто добавил в твой проект (modal.zip) код из первого поста и немного переработал момент закрытия формы


                                                            archimed7592, а чем отличается твой код от моего из первого поста
                                                            только this.Close() замененн на m_form.Close()

                                                            вщт мой код с этим изменением
                                                            ExpandedWrap disabled
                                                              /* -------------------------------------------------------------------------- */
                                                              using System;
                                                              using System.Collections.Generic;
                                                              using System.ComponentModel;
                                                              using System.Data;
                                                              using System.Drawing;
                                                              using System.Threading;
                                                              using System.Text;
                                                              using System.Windows.Forms;
                                                              /* -------------------------------------------------------------------------- */
                                                              namespace mcl
                                                              {
                                                                  public partial class WaitForm : Form
                                                                  {
                                                                      /* ------------------------------------------------------------------ */
                                                                      private static int m_index = 0;
                                                                      private static WaitForm m_form = null;
                                                                      private static Thread m_thread = null;
                                                                      private static String m_message;
                                                                      /* ------------------------------------------------------------------ */
                                                                      private WaitForm ()
                                                                      {
                                                                          InitializeComponent();
                                                                          MessageLabel.Text = m_message;
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      public static void show(String message)
                                                                      {
                                                                          m_index = 0;
                                                                          m_message = message;
                                                                          ThreadStart start = new ThreadStart (run);
                                                                          m_thread = new Thread (start);
                                                                          m_thread.Start();
                                                                          Thread.Sleep(1000 /*2000*/);
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      public static void close()
                                                                      {
                                                                          m_form.Invoke(new EventHandler(m_form.Close));
                                                                          m_form.Dispose();
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      private static void run ()
                                                                      {
                                                                          m_form = new WaitForm ();
                                                                          Application.Run(m_form);
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      private void WaitForm_Load(object sender, EventArgs e)
                                                                      {
                                                                          int screenWidth = Screen.PrimaryScreen.Bounds.Width;
                                                                          int screenHeight = Screen.PrimaryScreen.Bounds.Height;
                                                                          int x = (screenWidth - this.ClientSize.Width) / 2;
                                                                          int y = (screenHeight - this.ClientSize.Height) / 2;
                                                               
                                                                          this.Location = new Point(x, y);
                                                                          this.Timer.Enabled = true;
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      private void WaitForm_Closed(object sender, EventArgs e)
                                                                      {
                                                                          this.Timer.Enabled = false;
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      private void Close(object sender, EventArgs e)
                                                                      {
                                                                          m_form.Close();
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                      private void Timer_Tick(object sender, EventArgs e)
                                                                      {
                                                                          int count = ClockImages.Images.Count;
                                                                          PictureBox.Image = ClockImages.Images[m_index++ % count];
                                                                      }
                                                                      /* ------------------------------------------------------------------ */
                                                                  }
                                                              }
                                                              /* -------------------------------------------------------------------------- */
                                                            Сообщение отредактировано: zss -
                                                              Цитата zss @
                                                              archimed7592, а чем отличается твой код от моего из первого поста
                                                              только this.Close() замененн на m_form.Close()
                                                              тем, что, во-первых, я не определяю метода Close, во-вторых, я использую m_form.Close, а не this.Close т. к. это static метод и в нем this нету. ну и, в-третих, покажи свой InitializeComponent (лежит в *.Designer.cs)
                                                              Цитата zss @
                                                              private WaitForm ()
                                                              {
                                                              InitializeComponent();
                                                              MessageLabel.Text = m_message;
                                                              }
                                                                Цитата archimed7592 @
                                                                тем, что, во-первых, я не определяю метода Close

                                                                ты боишься что это перекрытие метода ? ну на сколько я понял без override в C# это не прокатит


                                                                Цитата archimed7592 @
                                                                во-вторых, я использую m_form.Close, а не this.Close т. к. это static метод и в нем this нету

                                                                это резонно :) но заметь, что метод Close в моем первом топике не static :) а значит у него есть this :)
                                                                А вот close вызывает Close через m_form.Invoke(new EventHandler(m_form.Close));


                                                                Цитата archimed7592 @
                                                                ну и, в-третих, покажи свой InitializeComponent (лежит в *.Designer.cs)

                                                                лови
                                                                ExpandedWrap disabled
                                                                  /* -------------------------------------------------------------------------- */
                                                                  namespace mcl
                                                                  {
                                                                      partial class WaitForm
                                                                      {
                                                                          /* ------------------------------------------------------------------ */
                                                                          /// <summary>
                                                                          /// Required designer variable.
                                                                          /// </summary>
                                                                          private System.ComponentModel.IContainer components = null;
                                                                          /* ------------------------------------------------------------------ */
                                                                          /// <summary>
                                                                          /// Clean up any resources being used.
                                                                          /// </summary>
                                                                          /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
                                                                          ///
                                                                          /* ------------------------------------------------------------------ */
                                                                          protected override void Dispose(bool disposing)
                                                                          {
                                                                              if (disposing && (components != null))
                                                                              {
                                                                                  components.Dispose();
                                                                              }
                                                                              base.Dispose(disposing);
                                                                          }
                                                                          /* ------------------------------------------------------------------ */
                                                                          #region Windows Form Designer generated code
                                                                   
                                                                          /// <summary>
                                                                          /// Required method for Designer support - do not modify
                                                                          /// the contents of this method with the code editor.
                                                                          /// </summary>
                                                                          private void InitializeComponent()
                                                                          {
                                                                              System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WaitForm));
                                                                              this.Timer = new System.Windows.Forms.Timer();
                                                                              this.Panel = new Labit.Controls.CatPanel();
                                                                              this.MessageLabel = new Labit.Controls.CatLabel();
                                                                              this.PictureBox = new Labit.Controls.CatPictureBox();
                                                                              this.ClockImages = new System.Windows.Forms.ImageList();
                                                                              this.Panel.SuspendLayout();
                                                                              this.SuspendLayout();
                                                                              //
                                                                              // Timer
                                                                              //
                                                                              this.Timer.Interval = 500;
                                                                              this.Timer.Tick += new System.EventHandler(this.Timer_Tick);
                                                                              //
                                                                              // Panel
                                                                              //
                                                                              this.Panel.BackgroundImg = null;
                                                                              this.Panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                                                                              this.Panel.Controls.Add(this.MessageLabel);
                                                                              this.Panel.Controls.Add(this.PictureBox);
                                                                              this.Panel.Dock = System.Windows.Forms.DockStyle.Fill;
                                                                              this.Panel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular);
                                                                              this.Panel.ForeColor = System.Drawing.SystemColors.WindowText;
                                                                              this.Panel.Location = new System.Drawing.Point(0, 0);
                                                                              this.Panel.Name = "Panel";
                                                                              this.Panel.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(217)))), ((int)(((byte)(204)))), ((int)(((byte)(192)))));
                                                                              this.Panel.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.Panel.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid;
                                                                              this.Panel.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue;
                                                                              this.Panel.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical;
                                                                              this.Panel.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal;
                                                                              this.Panel.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White;
                                                                              this.Panel.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.Panel.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.Flat;
                                                                              this.Panel.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Raised;
                                                                              this.Panel.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter;
                                                                              this.Panel.Size = new System.Drawing.Size(200, 48);
                                                                              this.Panel.TabIndex = 0;
                                                                              this.Panel.Text = "";
                                                                              //
                                                                              // MessageLabel
                                                                              //
                                                                              this.MessageLabel.BackgroundImg = null;
                                                                              this.MessageLabel.Font = new System.Drawing.Font("Tahoma", 8F, System.Drawing.FontStyle.Regular);
                                                                              this.MessageLabel.ForeColor = System.Drawing.SystemColors.WindowText;
                                                                              this.MessageLabel.Location = new System.Drawing.Point(42, 13);
                                                                              this.MessageLabel.Name = "MessageLabel";
                                                                              this.MessageLabel.Properties.AllowFocus = false;
                                                                              this.MessageLabel.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(217)))), ((int)(((byte)(204)))), ((int)(((byte)(192)))));
                                                                              this.MessageLabel.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White;
                                                                              this.MessageLabel.Properties.LookAndFeel.Background.UseParentColor = true;
                                                                              this.MessageLabel.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.MessageLabel.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.NoBorder;
                                                                              this.MessageLabel.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Sunken;
                                                                              this.MessageLabel.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter;
                                                                              this.MessageLabel.Size = new System.Drawing.Size(148, 20);
                                                                              this.MessageLabel.TabIndex = 6;
                                                                              this.MessageLabel.Text = "Подключение к комплексу...";
                                                                              //
                                                                              // PictureBox
                                                                              //
                                                                              this.PictureBox.BackgroundImg = null;
                                                                              this.PictureBox.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular);
                                                                              this.PictureBox.ForeColor = System.Drawing.SystemColors.WindowText;
                                                                              this.PictureBox.Image = ((System.Drawing.Image)(resources.GetObject("PictureBox.Image")));
                                                                              this.PictureBox.ImageAttribute = Labit.Controls.ImageAttribute.iaBestFit;
                                                                              this.PictureBox.Location = new System.Drawing.Point(5, 7);
                                                                              this.PictureBox.Name = "PictureBox";
                                                                              this.PictureBox.Properties.AllowFocus = false;
                                                                              this.PictureBox.Properties.InactiveBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
                                                                              this.PictureBox.Properties.InactiveForeColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.BackgroundStyle = Labit.Controls.BackgroundStyle.Solid;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.EndColor = System.Drawing.Color.Blue;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.GradientOrientation = Labit.Controls.Orientation.Vertical;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.GradientStyle = Labit.Controls.GradientStyle.Normal;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.StartColor = System.Drawing.Color.White;
                                                                              this.PictureBox.Properties.LookAndFeel.Background.UseParentColor = true;
                                                                              this.PictureBox.Properties.LookAndFeel.BorderColor = System.Drawing.SystemColors.ControlDark;
                                                                              this.PictureBox.Properties.LookAndFeel.BorderStyle = Labit.Controls.BorderStyle.NoBorder;
                                                                              this.PictureBox.Properties.LookAndFeel.FrameType = Labit.Controls.FrameType.Sunken;
                                                                              this.PictureBox.Properties.TextAlignment = Labit.Controls.ContentAlignment.MiddleCenter;
                                                                              this.PictureBox.Size = new System.Drawing.Size(33, 32);
                                                                              this.PictureBox.TabIndex = 5;
                                                                              this.PictureBox.Text = "";
                                                                              //
                                                                              // ClockImages
                                                                              //
                                                                              this.ClockImages.ImageSize = new System.Drawing.Size(128, 128);
                                                                              this.ClockImages.Images.Clear();
                                                                              this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource"))));
                                                                              this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource1"))));
                                                                              this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource2"))));
                                                                              this.ClockImages.Images.Add(((System.Drawing.Image)(resources.GetObject("resource3"))));
                                                                              //
                                                                              // WaitForm
                                                                              //
                                                                              this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
                                                                              this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
                                                                              this.AutoScroll = true;
                                                                              this.BackColor = System.Drawing.SystemColors.Control;
                                                                              this.ClientSize = new System.Drawing.Size(200, 48);
                                                                              this.ControlBox = false;
                                                                              this.Controls.Add(this.Panel);
                                                                              this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                                                                              this.Name = "WaitForm";
                                                                              this.Text = "Пожалуйста, подождите...";
                                                                              this.Closed += new System.EventHandler(this.WaitForm_Closed);
                                                                              this.Load += new System.EventHandler(this.WaitForm_Load);
                                                                              this.Panel.ResumeLayout(false);
                                                                              this.ResumeLayout(false);
                                                                   
                                                                          }
                                                                   
                                                                          #endregion
                                                                   
                                                                          private System.Windows.Forms.Timer Timer;
                                                                          private Labit.Controls.CatPanel Panel;
                                                                          private Labit.Controls.CatLabel MessageLabel;
                                                                          private Labit.Controls.CatPictureBox PictureBox;
                                                                          private System.Windows.Forms.ImageList ClockImages;
                                                                          /* ------------------------------------------------------------------ */
                                                                      }
                                                                  }
                                                                Сообщение отредактировано: zss -
                                                                  Цитата zss @
                                                                  this.Closed += new System.EventHandler(this.WaitForm_Closed);
                                                                  здесь все ок :)
                                                                  Цитата zss @
                                                                  ты боишься что это перекрытие метода ? ну на сколько я понял без override в C# это не прокатит
                                                                  я уверен, что это перекрытие метода... :) поставь вместо
                                                                  Цитата zss @
                                                                  private void Close(object sender, EventArgs e)
                                                                  {
                                                                  m_form.Close();
                                                                  }
                                                                  ExpandedWrap disabled
                                                                            private void Close(object sender, EventArgs e)
                                                                            {
                                                                                MessageBox.Show ("...");
                                                                                m_form.Close();
                                                                            }
                                                                  и увидишь, что он крутиться в рекурсии :)
                                                                    Цитата archimed7592 @
                                                                    и увидишь, что он крутиться в рекурсии

                                                                    у них сигнатуры абсолютно разные

                                                                    void Close()
                                                                    и
                                                                    void Close(object sender, EventArgs e)


                                                                    что-то не совсем клеится :)

                                                                    Добавлено
                                                                    Цитата archimed7592 @
                                                                    я уверен, что это перекрытие метода...

                                                                    убеди меня :)
                                                                    Сообщение отредактировано: zss -
                                                                      Цитата zss @
                                                                      что-то не совсем клеится
                                                                      согласен...
                                                                      ну хорошо, у тебя мой modal.zip компилится? просто у меня он помимо этого ещё и работает :) почему не работает твой? не знаю...давай проект полностью, разберемся...
                                                                        Цитата archimed7592 @
                                                                        у хорошо, у тебя мой modal.zip компилится? просто у меня он помимо этого ещё и работает

                                                                        да у меня он тоже работает. есть сомнения с Application.Run(m_form)

                                                                        складываетя впечатление, что в этом случае нет привязки к процесу
                                                                          Цитата zss @
                                                                          есть сомнения с Application.Run(m_form)

                                                                          складываетя впечатление, что в этом случае нет привязки к процесу
                                                                          Application.Run запускает message loop в текущем потоке... я че-т не пойму, у тебя твой код не работает, а мой работает? ты разницу нашел?
                                                                            сорри если влез не в тему - в начале поста интересовались почему дочерний процесс пашет при закрытии формы, его породившей...
                                                                            если вопрос еще актуален то вот - по умолчанию всякий новый процесс создается из свойством IsBackground = false, что и позволяет ему существовать самостоятельно. IsBackground = true спасет отца русской демократии.

                                                                            ПС:
                                                                            както тоже пробовал создавать формы в дочерних потоках - неблагодарная затея :) в чом проблема не разобрался - не было ни времени ни желания. проще перенести форму в основной поток. :)
                                                                              Цитата Fox @
                                                                              IsBackground = true

                                                                              а это чье свойство ?
                                                                                  Цитата archimed7592 @
                                                                                  Thread.IsBackground Property

                                                                                  а не заблокирует ли при этом порожденный поток родительский ?
                                                                                    Цитата
                                                                                    Thread.IsBackground Property

                                                                                    а не заблокирует ли при этом порожденный поток родительский ?

                                                                                    Не должен.
                                                                                      Цитата KotovAlexander @
                                                                                      Не должен.

                                                                                      странно, но тогда логично бы было его сделать по-умолчанию не false, а true
                                                                                      Сообщение отредактировано: zss -
                                                                                        При установке свойства потока Thread.IsBackground = true, создаётся поток-демон. Т. е. поток, который не может существовать без основного процесса. Умирает процесс - умирают все демоны. Естественно это свойство должно быть установлено перед Thread.Start().
                                                                                        ExpandedWrap disabled
                                                                                          Thread thr = new Thread(new ThreadStart(Run));
                                                                                          thr.IsBackground = true;
                                                                                          thr.Start();
                                                                                          Цитата SmartX @
                                                                                          Т. е. поток, который не может существовать без основного процесса

                                                                                          честно говоря я плохо знаю механизмы C#, но с точки зрения ОС не совсем логично существование потока без процесса
                                                                                          (особенно порожденного потока от родительского)
                                                                                          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                                          0 пользователей:


                                                                                          Рейтинг@Mail.ru
                                                                                          [ Script execution time: 0,1119 ]   [ 15 queries used ]   [ Generated: 12.07.25, 21:48 GMT ]