Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизНеверный дискриптор Найти похожие ветки
← →
TUser (2003-11-10 02:38) [0]При завершении потока выдается ошибка "Thread error: Неверный дискриптор (6)". В потоке выполняются некие вычисления, что-то сохраняется в файлы, но, вроде бы, никаких слишком "опасных" действий. В чем тут дело?
← →
TUser (2003-11-10 10:07) [1]Неужели только у меня такой глюк выскакивает?
← →
Anatoly Podgoretsky (2003-11-10 10:21) [2]TUser © (10.11.03 02:38)
Тебе тольк кажется.
← →
TUser (2003-11-10 10:44) [3]Так как лечится то? Точнее - в чем может быть причина. Вызывается он примерно так:
MyThread.Proirity, FreeOnTerminate, некоторые public поля, ...
MyThread.Resume;
MyThread.WaitFor;
...
А в Execute прописан вызов нескольких методов, определенных в потоке, которые что-то делают
← →
Zergling (2003-11-10 10:52) [4]TUser © (10.11.03 10:07) [1]
Предположительно обрашаешся к потоку (допустим преостановить/возобновить работу потока), в то время, когда он уже заврешил свою работу или переменая (A: TMyThread) к которой ты обращаешся равна NIL.
← →
Zergling (2003-11-10 10:52) [5]TUser © (10.11.03 10:07) [1]
Предположительно обрашаешся к потоку (допустим преостановить/возобновить работу потока), в то время, когда он уже заврешил свою работу или переменая (A: TMyThread) к которой ты обращаешся равна NIL.
← →
TUser (2003-11-10 10:58) [6]Нет, не обращаюсь.
Ладно, буду копать.
← →
panov (2003-11-10 11:13) [7]Ты же уже знаешь, в какой строке ошибка обычно.
← →
TUser (2003-11-10 11:16) [8]Ошибка ВСЕГДА при завершении потока. Когда Execute закончит выполняться. IDE останавливается на строчке после WaitFor. Но WaitFor здесь убрать нельзя - иначе будет еще хуже.
← →
Zergling (2003-11-10 11:17) [9]TUser ©
Как намекнул panov © (10.11.03 11:13) [7]
Ждем кода.
← →
TUser (2003-11-10 11:20) [10]Кода с собой нету - все дома. Буду сам копать. Но всем спасибо.
← →
han_malign (2003-11-10 12:10) [11]> Но WaitFor здесь убрать нельзя - иначе будет еще хуже.
- было уже на прошлой неделе:
либо FreeOnTerminate,
либо WaitFor; Free;
- вместе нельзя, потому что в вызове WaitFor, опрашивается состояние Handle-а потока(MsgWaitForMultipleObjects/WaitForSingleObject), который, как ты и просил, On Terminate - Free, опрашиваемый Handle - становится Invalid, и WaitForSingleObject(или MsgWaitForMultipleObjects) - соотвественно валится...
function TThread.WaitFor: LongWord;
var
H: array[0..1] of THandle;
WaitResult: Cardinal;
Msg: TMsg;
begin
H[0] := FHandle;
if GetCurrentThreadID = MainThreadID then //наш случай
begin
WaitResult := 0;
H[1] := SyncEvent;
repeat
{ This prevents a potential deadlock if the background thread
does a SendMessage to the foreground thread }
if WaitResult = WAIT_OBJECT_0 + 2 then
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
WaitResult := MsgWaitForMultipleObjects(2, H, False, 1000, QS_SENDMESSAGE);
CheckThreadError(WaitResult <> WAIT_FAILED);
if WaitResult = WAIT_OBJECT_0 + 1 then
CheckSynchronize;
until WaitResult = WAIT_OBJECT_0;
end else WaitForSingleObject(H[0], INFINITE);
CheckThreadError(GetExitCodeThread(H[0], Result));
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c