Перейти к содержимому


Фотография
- - - - -

C#


  • Эта тема закрыта Тема закрыта
2 ответов в этой теме

#1 лайт

лайт

    iddqd

  • True Members
  • PipPipPipPipPip
  • 3843 сообщений
9
Обычный
  • Пол:Мужчина

Опубликовано 26 July 2012 - 10:54

.net 4.5 (VS 11 beta)

Имеется две формы Form1 и Form2
Имеется функция в Form1:
public void setLog(string txt)
        {
            if (this.richTextBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(setLog);
                this.Invoke(d, new object[] { txt + "\n" });
            }
            else
            {
                this.richTextBox1.Text = this.richTextBox1.Text + txt + "\n";

                this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;
                this.richTextBox1.ScrollToCaret();

                try
                {
                    string path = Directory.GetCurrentDirectory() + "\\udp.log"; // Get the current directory.
                    DateTime current = DateTime.Now;
                    System.IO.StreamWriter file = new System.IO.StreamWriter(path, true);

                    file.WriteLine(current + ": " + txt + "\n");
                    file.Close();
                }
                catch (Exception e)
                {
                    MessageBox.Show("Произошла непредвиденная ошибка.\n" + e, "Ошибка");
                }
            }
        }

Так же имеется отдельный тред для подключения и выполнения запроса в Form1:
        public Form1()
        {
            InitializeComponent();

            setLog("Reading sql config.");

            Thread MyThread = new Thread(new ThreadStart (loadSQL));
            MyThread.Start();
        }
        ...
        private void loadSQL()
        {
            MySqlConnection connection = new MySqlConnection(connectionString);
            ...
            setLog("Done. Loaded " + count + " servers.");
        }

Суть: если не использовать мультипоточность, проблем с setLog не возникает при вызове Form2.
А если используется и вызвать Form2, то вываливается ошибка: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
this.Invoke(d, new object[] { txt + "\n" }); // вот на этой линии в функции setLog

Вопрос: как заставить все правильно работать и избежать этого эксцепшена?
  • 0

#2 Beowulf

Beowulf

    Злобный программист

  • True Members
  • PipPipPipPipPip
  • 1863 сообщений
197
Очень хороший
  • Пол:Мужчина
  • Интересы:Программирую все, что можно

Опубликовано 26 July 2012 - 11:11

http://stackoverflow...-a-control-unti

м? оно, нет?
  • 0

#3 лайт

лайт

    iddqd

  • True Members
  • PipPipPipPipPip
  • 3843 сообщений
9
Обычный
  • Пол:Мужчина

Опубликовано 26 July 2012 - 11:43

Да, заработало.
Прошлый раз почему-то не завелось, когда по этой же ссылке пробовал.
  • 1


Посетителей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных пользователей