Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-91389
Вопрос
2003-04-16 13:11
2003.04.28
Окно Windows


1-91358
Shirson
2003-04-15 15:44
2003.04.28
Команды MSWord и design mode


1-91282
Дмитрий
2003-04-17 10:31
2003.04.28
Определить кол-во запущенных экземпляров другой программы...


1-91290
Ghost_
2003-04-17 13:59
2003.04.28
Округление вверх


7-91561
Prizrak[ppm]
2003-03-11 13:31
2003.04.28
Как можно сделать в TMemo текст разноцветным?