Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
ВнизКак "безусловно" уничтожить поток? Найти похожие ветки
← →
Aleksandr. (2004-06-17 14:23) [0]Есть потомок от TObjectList, управляющий потоками. Каждый поток обращается к "закрепленной" за ним таблице Парадокса. При этом есть одна проблема - если в БДЕ при работе какого-то из потоков произошел сбой, то при попытке уничтожить поток и создать новый намертво умирает сам менеджер потоков. Код:
// этот метод должен убить сбойный поток и запустить новый
procedure TTblThreadManager.ResetTable(IDT: word);
var
A : TThreadTable;
begin
FResetCS.Enter;
try
try
A:=Tables[IDT];
if Assigned(A) then begin
try
if A.Suspended then
A.Resume;
A.Terminate
finally
FTables.Delete(FTables.IndexOf(A));
A:=TThreadTable.Create(IDT);
A.Resume
end
end
except
on E:Exception do
LogDBError(IDT,"ResetTable: "+E.Message)
end
finally
FResetCS.Leave
end
end;
// а это дестрактор табличного потока
destructor TThreadTable.Destroy;
begin
StoreCashedData;
FreeAndNil(FQueryList);
FreeAndNil(FQueryCS);
FreeAndNil(FUpdateList);
FreeAndNil(FUpdateCS);
FreeAndNil(FPXUpdator);
inherited
end;
Сбой БДЕ случается в объекте FPXUpdator, занимающимся конвертацией таблицы с MS SQL Server в Paradox, но он при трассировке в дестракторе уничтожается благополучно, а вот на строке Inherited трассировка заканчивается и менеджер потоков больше на запросы не реагирует (даже не выходя в finally). Попытка расстрассировать Inherited успеха не имеет - там какие-то экспорты в модуле Windows начинаются. Что может вызывать такой сокрушительный сбой или хотя бы как можно удалить поток без такого вывеса?
← →
default © (2004-06-17 14:34) [1]TerminateThread по-моему
← →
TUser © (2004-06-17 16:07) [2]Да. Он прибьет поток (виндовский). А объект потом, наверное, надо будет уничтожить самому.
← →
Aleksandr. (2004-06-18 11:58) [3]Спасибо! А что ему в параметр ExitCode загонять?
← →
Петров Денис © (2004-06-18 13:17) [4]> default © (17.06.04 14:34) [1]
Чтобы вызывать TerminateThread, нужны ОЧЕНЬ веские основания. Все, что рассказывает автор темы, на это явно не тянет.
> Aleksandr. (17.06.04 14:23)
Речь, насколько понимаю, идет о некоем конверторе данных из одного формата в другой. Сама по себе фраза "этот метод должен убить сбойный поток и запустить новый" вызывает массу вопросов типа "нафига?"
Уж не пытаешься ли ты обрабатывать каждую таблицу в отдельном потоке? Если да, то представь, что таблиц, например, 100. Открой диспечер задач, и посмотри, у какого из процессов число потоков хотя бы приближено к сотне? Если это попытка достичь быстродействия, то она, мягко говоря, неудачна.
Почему бы не определить причину возникновения загадочной ошибки BDE?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c