ОБСУЖДЕНИЕ

Два потока

6 ответов 5,5 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Здравствуйте товарищи програмисты.
У меня такой вопрос: Есть приложение Delphi, работающее с базой Oracle. В приложении запускаются два потока. Оба потока обращаются к базе. Один работает постоянно, другой спит, и "просыпается" раз в минуту.
Так вот в момент его активации приложение виснет. Подскажите кто знает, от чего это происходит и как с этим бороться?
 
у Вас ошибка в 404 строчке
 
да там кода всего на 20 строк ;)
 
НУ так а я про что ... ошибка 404 - строка не найдена ;)
 
Слишком мало информации чтобы что-то посоветовать...
Как правило, частенко бывают проблемы когда несколько потоков пытаются использовать один ресурс
 
Для 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;

Если у кого есть мысли или литература по этой теме, пожалуста пишите. Я с использованием потоков столкнулся недавно, поэтому еще много не знаю.
 
Попробуй завести 2 одинаковых ADOConnection, и работай в первом потоке через ADOConnection1, а во втором через ADOConnection2.
 

Ещё по теме