На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Модальная форма
    Цитата 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;
                                }
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0520 ]   [ 15 queries used ]   [ Generated: 17.07.25, 20:31 GMT ]