Текущий архив: 2003.04.28;
Скачать: CL | DM;
Вниз
Что может из БДЕ вызвать причины зависания в потоке с таблицей? Найти похожие ветки
← →
Aleksandr © (2003-04-08 19:44) [0]Понял я, что через OpenDataSource мне не светит наладить сброс таблицы. Не могу понять - в программе есть сотня потоков, работающих каждый с индивидуальной SQL-таблицей. По запросу пользователей СКуЛьная таблицы скидывается в Парадокс. Но вот при каких-то хитрых причинах поток при скидке таблицы может зависнуть, никак не обрабатываясь try...except или try...finally.
Кто-нибудь встречал такое, чтобы на попытке открыть/обновить таблицу она вешала поток?
Процедурка создания таблицы в Парадоксе:
procedure SQLMakeTableForOut;
var
TmpName : string;
TrName : string;
SrcName : string;
OutTable : TTable;
TmpOutBasesDir : string;
AQuery : TADOQuery;
Local : string;
Lang : string;
begin
try
if NOT MasterTbl.TblItem[FIDT].Exists then //есть ли такая таблица вообще
Exit;
TmpOutBasesDir := OutBasesDir;
TmpName:=TmpOutBasesDir+ExtractFileName(TableFName);
SrcName:=BasesDir+ExtractFileName(TableFName);
try
if (NOT FileExists(TmpName)) OR (NOT IsTrueDate(TableTime,FileAge(TmpName))) then begin
if NOT FileExists(SrcName) then
Exit;
AQuery:=MasterTbl.GetADOQuery; //создать АДО-компоненту
try
AQuery.SQL.Add("SELECT * FROM "+MasterTbl.TblName[FIDT]);
case MasterTbl.GetTablePXFields(FIDT) of
1 : AQuery.SQL.Add("ORDER BY 1");
2 : AQuery.SQL.Add("ORDER BY 1,2");
end;
AQuery.FieldDefs.Update;
OutTable:=TTable.Create(nil);
try
OutTable.TableName:=ExtractFileName(SrcName);
OutTable.DatabaseName:=BasesDir;
OutTable.TableType:=ttParadox;
//проинициализировали таблицу-шаблон, с которой будет рисоваться таблица на выход
try
if MasterTbl.TblItem[FIDT].PXFields>0 then begin
if NOT FileExists(ChangeFileExt(SrcName,".px")) then begin
case MasterTbl.TblItem[FIDT].PXFields of
1 : Lang:=AQuery.FieldDefs[0].Name;
2 : Lang:=AQuery.FieldDefs[0].Name+";"+AQuery.FieldDefs[1].Name;
end;
OutTable.AddIndex("",Lang,[ixPrimary])
end
end;
вот если перед и после этой строчки поставить запись в лог, то будет первая строчка, а затем поток зависнет. Впрочем, то же будет при попытке открыть таблицу.
OutTable.FieldDefs.Update;
OutTable.IndexDefs.Update;
OutTable.DatabaseName:=TmpOutBasesDir;
if OutTable.Exists then
OutTable.DeleteTable;
OutTable.CreateTable;
Lang:=GetLocale(SrcName);
if Lang="ascii" then
ChangeLocale(TmpOutBasesDir,OutTable.TableName,"cyrr");
Local:=MoveDataFromADO(AQuery,OutTable);//функция непосредственной записи в таблицу из таблицу
if Local<>"" then begin
WriteLog(LogFilesDir+"TBLLogs\"+TableName+"qr.log",lmInformation,"I"," : moving data from ADO - "+Local);
Exit
end;
if Lang="ascii" then ChangeLocale(TmpOutBasesDir,OutTable.TableName,Lang)
except
on E:Exception do
LogDBException( DBItemLogIDChar, """ + TableName +"""+ " SQLMakeTableForOut ", E)
end
finally
FreeAndNil(OutTable)
end
finally
AQuery.Close;
FreeAndNil(aQuery)
end
end;
except
on E:Exception do
LogDBException( DBItemLogIDChar, """ + TableName +"""+ " SQLMakeTableForOut ", E)
end
except
on E:Exception do
LogDBException( DBItemLogIDChar, """ + TableName +"""+ " SQLMakeTableForOut ", E)
end
end;
← →
sniknik © (2003-04-08 23:24) [1]> в программе есть сотня потоков
не вдаваясь в подробности (текст разбирать лень)
но
вроде есть некоторые ограничения.
1) BDE на количество открытых сессий, со сдандартными настройками 7-8 и максимум 32, вроде, может память и "сбоит" но не сто точно, а по правильному нужно отдельную сессию а поток.
2) ограничение виндов на количество потоков в одном процессе (вроде бы 64) но дело это темное сам за документацией порыскай.
3) зря ты с OpenDataSource до конца не разобрался, это работает точно (довольно просто, и очень быстро, не нужно будет столько потоков). кстати возможно тебе просто надо поставить последнюю версию MDac и Jet. потом есть еще линк сервер, посмотри может тебе это проще будет (в Bol).
Страницы: 1 вся ветка
Текущий архив: 2003.04.28;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.02 c