Image

Category:

Заполнение таблицы БД в другом потоке

В общем, у меня есть таблица с большим числом записей.
Есть форма Form1 со списком combobox1 (данные берутся как раз из этой самой таблицы).
Чтобы форма не "тормозила" при открытии, я решил сделать обновление этого списка в другом потоке.
Но вот не пойму, в чем загвоздка.



Делаю следующим образом.

В заголовке класса у меня есть

Thread ^MyThread;
static Form1 ^F1;


Также есть функция заполнения таблицы (которая должна работать в другом потоке):
static void FillAll(){
System::Threading::Monitor::TryEnter(F1->comboBox1,-1);
F1->TestObjectsTableAdapter->Fill(F1->ThreadTstDataSet->TestObjects);
System::Threading::Monitor::Exit(F1->comboBox1);
}


В конструкторе класса прописал:
F1 = this;


Ну и, собственно, потом просто запускаю поток
MyThread=gcnew Thread(gcnew ThreadStart(&FillAll));
MyThread->IsBackground=true;
MyThread->Start();

Весь прикол в том, что в таблицу-то данные возвращаются.
int CountR = this->ThreadTstDataSet->TestObjects->Rows->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(ThreadTstDataSet->TestObjects);
this->Invoke(gcnew BindComboDelegate(this, &Form1::BindCombobox));
///Invoke нужен, чтобы обновить данные из UI потока!!!
}

Ну, и собственно, обновление данных в датасорсе:

delegate void BindComboDelegate();
void BindCombobox(){
ThreadTstDataSet->AcceptChanges();
}




UPD. Проблема решена. См. под катом.


x-post to Imageru_programming