Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Как "безусловно" уничтожить поток?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
9-1079372016
Юрий Ж.
2004-03-15 20:33
2004.07.04
Научите...


14-1087131562
SergP
2004-06-13 16:59
2004.07.04
TClientSocket, OnError


1-1087342300
Dmitry
2004-06-16 03:31
2004.07.04
Как правильно установить DelphiX (интерфейс к DirectX) в Delphi 7


3-1086611505
Undert
2004-06-07 16:31
2004.07.04
SQL запрос


6-1084336512
leonidus
2004-05-12 08:35
2004.07.04
Взаимодействие с TheBat 2.0