База Данных и потоки

  • Автор темы boden
  • Дата начала
B

boden

Гость
#1
Суть: надо создать поток(и) из которого осуществлять чтение/запись в БД. Но я столкнулся с некоторыми проблемами. Прошу помощи.

Мой код:
Код:
Код:
DWORD WINAPI SQL_Thread(LPVOID ptr)
{
// точка (А)

return 0;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ------------ начало блока (А) -------------------
TSession* s;
TDatabase* db;

s=new TSession(0);
s->SessionName="my_session";
s->Open();

db=new TDatabase(0);
db->DatabaseName="MY_DB";
db->DriverName="MSACCESS";
db->HandleShared=true;
db->Exclusive=false;
db->KeepConnection=false;
db->Params->Text="DATABASE NAME=F:\\borland\\work\\data.mdb";
db->LoginPrompt=false;
db->SessionName="my_session";
db->Open(); /// точка Х

db->Execute("insert into images (`value`, `hash`,`system_id`) values(1111,1222,1)");
// ------------ конец блока (А) --------------
DWORD thr=0;
CreateThread(NULL,0,&SQL_Thread,0,0,&thr);
}
Если исполнять этот код, как приведено, т.е. в основном потоке, то все зашибись, если перенести "блок А"(или, например, последнюю инструкцию с Execute) в "точку А" (в создаваемый поток), то прога падает в "точке Х"(если перенесена только строка с execute, то, соответственно, в точке с execute). Ошибка вылетает "Ассеss violation at .... write of address ..."
 
B

Barmutik

Гость
#2
Если мне не изменяет память до операции с БД имеют проблемы с многопоточностью и указано что надо дёргать их синхронно в одном потоке...
 
B

boden

Гость
#3
Если мне не изменяет память до операции с БД имеют проблемы с многопоточностью и указано что надо дёргать их синхронно в одном потоке...
Т.е. чего нить типа: в основной форме по таймеру проверять значение некоей переменной, в которую заносить значение из потоков!?.
Хм.... я уже думал об этом, но был уверен, что есть более простой, правильный способ ((( А ведь процессы могут иметь параллельный доступ к БД... а потоки нет......
Хм.... есть еще такой пример в samples "BKQUERY".... надеюсь это мой вариант и надеюсь, зватит ума в нем разобраться...
TITLE:
BKQUERY

DESCRIPTION:
Demonstrates a background query on a database.

DEMONSTRATES:
Multi-threaded SQL queries, thread synchronization using
Interlocked increment, user-defined resources and string
resources.
 
04.09.2006
2 566
2
Минск
#4
Для: boden
А ты уверен что твой подход правильный? По каждому нажатию на кнопку создавать объекты БД и сессии (кстати, ты их не удаляешь), инициализировать их и только после этого выполнять запрос. Это если пользователь нажмет 50 раз кнопку, то 50 раз выполняться абсолютно ненужные действия
 
B

boden

Гость
#5
А ты уверен что твой подход правильный? По каждому нажатию на кнопку создавать объекты БД и сессии,инициализировать их и только после этого выполнять запрос. Это если пользователь нажмет 50 раз кнопку, то 50 раз выполняться абсолютно ненужные действия
Предлагаете использовать уже имеющиеся объекты? Та же проблема с Ассеss violation. Причем, ладно бы переменная где то портилась, но значение db в момент вызова execute имеет правильное, нужное зачение.
(кстати, ты их не удаляешь),
разрушить проще чем создать))) мне бы для начала хотя бы их создать, чтоб работало. Все равно до момента разрушения прога еще не доживает