1. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Первый товар уже в продаже: Консультация на тему ИБ от Ondrik8

    Скрыть объявление
  2. Спонсор публикаций Marketplace codeby. Сервис, который так долго ждали. При расчетах используем биткоин. Второй товар маркетплейса: Надёжная обфускация вашей программы от PingVinich

    Скрыть объявление

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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем boden, 4 апр 2007.

  1. boden

    boden Гость

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

    Мой код:
    Код:
    Код (Text):
    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 ..."
     
  2. Barmutik

    Barmutik Гость

    Репутация:
    0
    Если мне не изменяет память до операции с БД имеют проблемы с многопоточностью и указано что надо дёргать их синхронно в одном потоке...
     
  3. boden

    boden Гость

    Репутация:
    0
    Т.е. чего нить типа: в основной форме по таймеру проверять значение некоей переменной, в которую заносить значение из потоков!?.
    Хм.... я уже думал об этом, но был уверен, что есть более простой, правильный способ ((( А ведь процессы могут иметь параллельный доступ к БД... а потоки нет......
    Хм.... есть еще такой пример в samples "BKQUERY".... надеюсь это мой вариант и надеюсь, зватит ума в нем разобраться...
     
  4. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    Для: boden
    А ты уверен что твой подход правильный? По каждому нажатию на кнопку создавать объекты БД и сессии (кстати, ты их не удаляешь), инициализировать их и только после этого выполнять запрос. Это если пользователь нажмет 50 раз кнопку, то 50 раз выполняться абсолютно ненужные действия
     
  5. boden

    boden Гость

    Репутация:
    0
    Предлагаете использовать уже имеющиеся объекты? Та же проблема с Ассеss violation. Причем, ладно бы переменная где то портилась, но значение db в момент вызова execute имеет правильное, нужное зачение.
    разрушить проще чем создать))) мне бы для начала хотя бы их создать, чтоб работало. Все равно до момента разрушения прога еще не доживает
     
Загрузка...
Похожие Темы - База Данных потоки
  1. Кешаня
    Ответов:
    1
    Просмотров:
    271
  2. Celestial
    Ответов:
    4
    Просмотров:
    351
  3. Zhuk
    Ответов:
    18
    Просмотров:
    2.357
  4. ALEXandr2033
    Ответов:
    0
    Просмотров:
    1.415
  5. Apoka5555
    Ответов:
    0
    Просмотров:
    1.636

Поделиться этой страницей