• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Два потока

  • Автор темы Crucian
  • Дата начала
C

Crucian

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

morpheus

НУ так а я про что ... ошибка 404 - строка не найдена ;)
 
S

SNike

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

Crucian

Для 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;

Если у кого есть мысли или литература по этой теме, пожалуста пишите. Я с использованием потоков столкнулся недавно, поэтому еще много не знаю.
 
S

Silver Wind

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!