Проблема GUI + фоновый поток
От: Larsik Россия  
Дата: 04.12.07 08:17
Оценка:
Добрый день! Помогите "не знающему".

Суть вопроса:
Есть база данных, и есть файл с SQL командами. при запуске приложения хотел выполнить их в фоновый поток, а на форму в ProgressBar'е выводить результат. Прочитал статью с "местную" по работе с потоками, но так и не нашел как обратиться к контролу из фоновой задачи. В потоке создаю еще одно подключение, что бы основные функции нормально работали, так как паралельные транзакции не поддерживаются (толи ограничение sql-сервака или Framework'a)

вот код который и работает 50/50, а мне нужно все 100

запуск потока
Thread t = new Thread(SQLScript);
t.Start(DM.Connection.ConnectionString);


код потока
        public void SQLScript(Object ConnectionString)
        {
            if (System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + @"\sql\SQLScript.sql") == true)
            {
                lock (this.toolStripStatusLabel2)
                {
                    this.toolStripStatusLabel2.Text = "Переиндексация таблиц";
                }

                lock (this.toolStripProgressBar1)
                {
                    this.toolStripProgressBar1.Value = 0;
                }

                DataModuleClass dm1 = new DataModuleClass();

                dm1.Connection = new FbConnection((String)ConnectionString);
                dm1.Connection.Open();

                dm1.Command = new FbCommand();
                dm1.Command.Connection = dm1.Connection;

                List<string> reindex = new List<string>();
                reindex.AddRange(System.IO.File.ReadAllLines(System.IO.Directory.GetCurrentDirectory() + @"\ReIndexDatabase.sql"));

                lock (this.toolStripProgressBar1)
                {
                    this.toolStripProgressBar1.Maximum = reindex.Count;
                }

                dm1.Command.Transaction = dm1.Connection.BeginTransaction();
                for (int i = 0; i < reindex.Count; i++)
                {
                    dm1.Command.CommandText = reindex[i];
                    dm1.Command.ExecuteNonQuery();

                    lock (this.toolStripProgressBar1)
                    {
                        this.toolStripProgressBar1.Value += 1;
                    }
                }
                dm1.Command.Transaction.Commit();

                lock (this.toolStripStatusLabel2)
                {
                    this.toolStripStatusLabel2.Text = "простой";
                }

            }
        }



04.12.07 14:36: Перенесено модератором из '.NET' — AndrewVK
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.