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

    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 @
                                у класса десатки методов - и что их в отдельный пок все - слишком сложно
                                не совсем понимаю какие могут быть сложности :) хоть убей...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0512 ]   [ 16 queries used ]   [ Generated: 26.12.24, 10:20 GMT ]