Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-22752
Ptr
2002-03-27 11:18
2002.04.08
Hi All ! Кто-нить знает, как поменять форму курсора в чужом (внешнем) приложении ?


1-22766
Dimedrol
2002-03-27 13:55
2002.04.08
Сборщик мусора в памяти ?


1-22624
dimonf
2002-03-27 18:04
2002.04.08
Как поставить компонент написанный для D5 в D6?


3-22592
Siberia
2002-03-11 17:43
2002.04.08
использование UPPER в SQL-запросах


14-22806
alan
2002-02-27 06:26
2002.04.08
Помогите найти...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский