1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

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

Два потока

Тема в разделе "Delphi - Базы данных", создана пользователем Crucian, 26 дек 2007.

  1. Crucian

    Crucian Гость

    Репутация:
    0
    Здравствуйте товарищи програмисты.
    У меня такой вопрос: Есть приложение Delphi, работающее с базой Oracle. В приложении запускаются два потока. Оба потока обращаются к базе. Один работает постоянно, другой спит, и "просыпается" раз в минуту.
    Так вот в момент его активации приложение виснет. Подскажите кто знает, от чего это происходит и как с этим бороться?
     
  2. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    у Вас ошибка в 404 строчке
     
  3. ????

    ???? Гость

    Репутация:
    0
    да там кода всего на 20 строк ;)
     
  4. morpheus

    morpheus скриптописец

    Репутация:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    3.915
    Симпатии:
    1
    НУ так а я про что ... ошибка 404 - строка не найдена ;)
     
  5. SNike

    SNike Гость

    Репутация:
    0
    Слишком мало информации чтобы что-то посоветовать...
    Как правило, частенко бывают проблемы когда несколько потоков пытаются использовать один ресурс
     
  6. Crucian

    Crucian Гость

    Репутация:
    0
    Для Morpheus:
    Я так и знал ;)

    Концептуально модель выглядит так:
    Код:
    ----Первый поток--------------------
    procedure Thread1.Execute;
    begin
    
    try
    
    try
    
    ADOConnection1.Connected:=True;
    
    ADOConnection1.BeginTrans;
    
    
    //Вызовы хранимых процедур....
    
    
    except
    
    end;
    
    
    finally
    
    ADOConnection1.CommitTrans;
    
    ADOConnection1.Connected:=False;
    
    Terminate;
    
    end;
    
    end;
    
    ----Второй поток--------------------
    procedure Tread2.Execute;
    begin
    
    while not Terminated do begin
    Synchronize(DoWork);
    sleep(60000);
    end;
    
    end;
    
    procedure Tread2.DoWork;
    begin
    try
    try
    
    DataModule1.Сommand.CommandText:='select 1 from dual';
    DataModule1.Сommand.Execute;
    
    except
    end;
    finally
    end;
    
    end;
    
    ----Вызов потоков--------------------
    //Второй поток запускается в момент активации глаувной формы приложения 
    
    procedure TMainForm.FormActivate(Sender: TObject);
    begin
    fTread:=KeepAliveTread.Create(false);
    fTread.FreeOnTerminate:=true;
    end;
    
    //Первый поток запускается пользователем
    procedure TMainForm.Button1Click(Sender: TObject);
    var sTread:Thread1;
    begin
    
    try
    sTread:=Thread1.Create(true);
    sTread.Priority:=tpNormal;
    sTread.FreeOnTerminate:=true;
    sTread.Resume;
    except
    
    end;
    end;
    Если у кого есть мысли или литература по этой теме, пожалуста пишите. Я с использованием потоков столкнулся недавно, поэтому еще много не знаю.
     
  7. Silver Wind

    Silver Wind Гость

    Репутация:
    0
    Попробуй завести 2 одинаковых ADOConnection, и работай в первом потоке через ADOConnection1, а во втором через ADOConnection2.
     
Загрузка...

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