Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
ВнизTThread: Что значит ошибка Найти похожие ветки
← →
lipskiy (2002-03-24 23:23) [0]В моем потоке обновляются данные через Инет.
Внутри потока создается компонент DialUp, написанный на основе API-функций RAS.
У этого компонента есть метод HangUp - разорвать связь.
Назначаю вызов этого метода на кнопку "Прервать", по которой после разрыва связи вызываю Terminate для потока, в обработчике которого уничтожаю свой экземпляр DialUp.
При нажатии на эту кнопку, если набор номера уже закончен и пошел процесс аутентификации, возникает ошибка:
...raised exception class EOutOfResources with message "Нет доступных таймеров"...
Если после HangUp но перед Terminate вставляю sleep(1000), то ошибка возникает значительно реже, а если sleep(1500), то еще ни разу не возникла.
Вот код функции из компонента:
Function TDialUp.HangUpConn(Handle : THRasConn) : Integer;
var
Stat:TRasConnStatus;
begin
FillChar(Stat, Sizeof(TRasConnStatus), 0);
Stat.dwSize:=Sizeof(TRasConnStatus); // Must be zeroed and sized
Result:=RasHangUp(Handle);
if( result<>0 )then exit ;
while (RasGetConnectStatus(handle,stat)<>ERROR_INVALID_HANDLE) do
begin
sleep(0);
Application.ProcessMessages;
end; // Wait actual closure, else port could remain locked
end;
Вроде бы, пока разрыв не произойдет, из этой функции выхода нет. Если в OnTerminate не делать DialUp.Free, то ошибки тоже не возникает.
Есть какие-нибудь мнения, из-за чего такое может быть и как с этим корректно бороться?
← →
Nikolay M. (2002-03-25 14:27) [1]IMHO, присходит попытка создать таймер серез апи. Насколько помню, количество таймеров начиная с Win95 практически неограничено в разумных границах, то можно предположить, что те полторы секунды, на которые поставлен Sleep идет постоянное создание/убиение таймеров.
?
Поищи по SetTimer/KillTimer.
← →
Digitman (2002-03-25 14:46) [2]>>".. для потока, в обработчике которого..."
Как это понимать ? У потока нет понятие "обработчик"
← →
lipskiy (2002-03-25 17:28) [3]
> Terminate для потока, в обработчике которого
Обработчик события Terminate, а не потока ;)
← →
lipskiy (2002-03-25 17:30) [4]2 Nikolay M.
Спасибо, поищу.
← →
md_test (2002-03-25 18:50) [5]Все правильно. В доке по RASAPI так и написано про Sleep.
Рекомендуется делать Sleep(3000).
← →
lipskiy (2002-03-25 22:29) [6]2 md_test
Да ну! Вот те на, и это называется красивое программирование!
Спасибо за инфу, а то уже запарился, думал, ну и баги пошли...
А где это конкретно написано? Можешь указать конкретнее?
← →
Suntechnic (2002-03-26 01:34) [7]>lipskiy © (25.03.02 22:29)
An application should not call RasHangUp and then immediately exit. The connection state machine needs time to properly terminate. If the system prematurely terminates the state machine, the state machine may fail to properly close a port, leaving the port in an inconsistent state. A simple way to avoid this problem is to call Sleep(3000) after returning from RasHangUp; after that pause, the application can exit. A more responsive way to avoid the problem is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.
← →
Digitman (2002-03-26 08:38) [8]Чушь. Как раз - с точностью до наоборот !
A more responsive way to avoid the problem is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.
>lipskiy
Вот такие вещи
Application.ProcessMessages
в доп.потоке, как минимум, не имеют смысла.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c