Заполнение таблицы БД в другом потоке
В общем, у меня есть таблица с большим числом записей.
Есть форма Form1 со списком combobox1 (данные берутся как раз из этой самой таблицы).
Чтобы форма не "тормозила" при открытии, я решил сделать обновление этого списка в другом потоке.
Но вот не пойму, в чем загвоздка.
Делаю следующим образом.
В заголовке класса у меня есть
Thread ^MyThread;
static Form1 ^F1;
Также есть функция заполнения таблицы (которая должна работать в другом потоке):
static void FillAll(){
System::Threading::Monitor::TryEnter(F1- >comboBox1,-1);
F1->TestObjectsTableAdapter->Fill(F1->Th readTstDataSet->TestObjects);
System::Threading::Monitor::Exit(F1->com boBox1);
}
В конструкторе класса прописал:
F1 = this;
Ну и, собственно, потом просто запускаю поток
MyThread=gcnew Thread(gcnew ThreadStart(&FillAll));
MyThread->IsBackground=true;
MyThread->Start();
Весь прикол в том, что в таблицу-то данные возвращаются.
int CountR = this->ThreadTstDataSet->TestObjects->Row s->Count;
CountR показывает ненулевое положительное значение.
Вот только почему-то эти данные не отображаются в ComboBox-е!
Binding-и везде прописаны. Вроде все правильно. Ничего не могу понять =(
Вот тут тестовый проект (VS2005, NET, VC++).
Там по кнопочке "Push To Fill" должно все заполняться.
Помогите, плиз.
Upd. Проблема решена!
В общем, проблема решилась. Косяк был в том, что ДатаСоурс не хотел обновляться из другого потока (потока, который его не создавал).
Сделал следующим образом.
Функция запуска потока заполнения:
MyThread=gcnew Thread(gcnew ThreadStart(this, &Form1::ThreadTableFillProc));
MyThread->IsBackground=true;
MyThread->Start();
Функция заполнения таблицы:
void ThreadTableFillProc()
{
TestObjectsTableAdapter->Fill(ThreadTstD ataSet->TestObjects);
this->Invoke(gcnew BindComboDelegate(this, &Form1::BindCombobox));
///Invoke нужен, чтобы обновить данные из UI потока!!!
}
Ну, и собственно, обновление данных в датасорсе:
delegate void BindComboDelegate();
void BindCombobox(){
ThreadTstDataSet->AcceptChanges();
}
UPD. Проблема решена. См. под катом.
x-post to
ru_programming
Есть форма Form1 со списком combobox1 (данные берутся как раз из этой самой таблицы).
Чтобы форма не "тормозила" при открытии, я решил сделать обновление этого списка в другом потоке.
Но вот не пойму, в чем загвоздка.
Делаю следующим образом.
В заголовке класса у меня есть
Thread ^MyThread;
static Form1 ^F1;
Также есть функция заполнения таблицы (которая должна работать в другом потоке):
static void FillAll(){
System::Threading::Monitor::TryEnter(F1-
F1->TestObjectsTableAdapter->Fill(F1->Th
System::Threading::Monitor::Exit(F1->com
}
В конструкторе класса прописал:
F1 = this;
Ну и, собственно, потом просто запускаю поток
MyThread=gcnew Thread(gcnew ThreadStart(&FillAll));
MyThread->IsBackground=true;
MyThread->Start();
Весь прикол в том, что в таблицу-то данные возвращаются.
int CountR = this->ThreadTstDataSet->TestObjects->Row
CountR показывает ненулевое положительное значение.
Вот только почему-то эти данные не отображаются в ComboBox-е!
Binding-и везде прописаны. Вроде все правильно. Ничего не могу понять =(
Вот тут тестовый проект (VS2005, NET, VC++).
Там по кнопочке "Push To Fill" должно все заполняться.
Помогите, плиз.
Upd. Проблема решена!
В общем, проблема решилась. Косяк был в том, что ДатаСоурс не хотел обновляться из другого потока (потока, который его не создавал).
Сделал следующим образом.
Функция запуска потока заполнения:
MyThread=gcnew Thread(gcnew ThreadStart(this, &Form1::ThreadTableFillProc));
MyThread->IsBackground=true;
MyThread->Start();
Функция заполнения таблицы:
void ThreadTableFillProc()
{
TestObjectsTableAdapter->Fill(ThreadTstD
this->Invoke(gcnew BindComboDelegate(this, &Form1::BindCombobox));
///Invoke нужен, чтобы обновить данные из UI потока!!!
}
Ну, и собственно, обновление данных в датасорсе:
delegate void BindComboDelegate();
void BindCombobox(){
ThreadTstDataSet->AcceptChanges();
}
UPD. Проблема решена. См. под катом.
x-post to
ru_programming