Проблема 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
Re: Проблема GUI + фоновый поток
От: vitz  
Дата: 04.12.07 08:49
Оценка:
Здравствуйте, Larsik, Вы писали:

L>Добрый день! Помогите "не знающему".


L>Суть вопроса:

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

Было и не раз.
Используй Control.Invoke
Re: Проблема GUI + фоновый поток
От: ZARATUSTR Россия  
Дата: 04.12.07 08:59
Оценка:
Можно при помощи анономных делегатов:

delegate void SetText(string Text);

// в методе SQLScript
public void SQLScript(Object ConnectionString)
{
   //...
   SetText setText = delegate(string Text)
   {
      this.toolStripStatusLabel2.Text = Text;
   };
   this.Invoke(setText, new object[] {"Переиндексация таблиц"});

   //... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
}
Re: Проблема GUI + фоновый поток
От: Nickolay Ch  
Дата: 04.12.07 09:02
Оценка:
Имхо, для этой цели лучше использовать BackgroundWorker
Re[2]: Проблема GUI + фоновый поток
От: Larsik Россия  
Дата: 04.12.07 09:18
Оценка:
Здравствуйте, ZARATUSTR, Вы писали:

ZAR>Можно при помощи анономных делегатов:

ZAR>

ZAR>delegate void SetText(string Text);

ZAR>// в методе SQLScript
ZAR>public void SQLScript(Object ConnectionString)
ZAR>{
ZAR>   //...
ZAR>   SetText setText = delegate(string Text)
ZAR>   {
ZAR>      this.toolStripStatusLabel2.Text = Text;
ZAR>   };
ZAR>   this.Invoke(setText, new object[] {"Переиндексация таблиц"});

ZAR>   //... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
ZAR>}

ZAR>


Спасибо. вопрос решился))
Re[3]: Проблема GUI + фоновый поток
От: Rius Россия  
Дата: 04.12.07 11:53
Оценка:
Здравствуйте, Larsik, Вы писали:

L>Здравствуйте, ZARATUSTR, Вы писали:


ZAR>>Можно при помощи анономных делегатов:

ZAR>>

ZAR>>delegate void SetText(string Text);

ZAR>>// в методе SQLScript
ZAR>>public void SQLScript(Object ConnectionString)
ZAR>>{
ZAR>>   //...
ZAR>>   SetText setText = delegate(string Text)
ZAR>>   {
ZAR>>      this.toolStripStatusLabel2.Text = Text;
ZAR>>   };
ZAR>>   this.Invoke(setText, new object[] {"Переиндексация таблиц"});

ZAR>>   //... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
ZAR>>}

ZAR>>


L>Спасибо. вопрос решился))


ещё проще:
this.Invoke((EventHandler)delegate
{
toolStripStatusLabel2.Text = "Переиндексация таблиц...";
});
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.