Як визначити, що програма зависла

Всім добрий час!

Проблема така: Додаток-процес працює постійно, але іноді він зависає з так і нез'ясованої причини. Чи можна зробити так, щоб програма сама визначила, що вона зависла (у цьому випадку я міг би вставити код вивантаження/завантаження програми)? Якщо такий варіант неможливий, то який є більш-менш простий спосіб визначити з іншої програми, що потрібна прога висить?

Дякую за увагу.

>додаток сам визначив, що він повис Ні, звичайно.

9X - IsHungThread (ThreadId: Thandle): BOOL; NT, 2K - IsHungAppWindow (Wnd: THandle): BOOL;

Ще варіант - з одного із потоків процесу посилати SendMessage(TimeOut) підозрілому на зависання потоку, аналізувати відповідь

To MBo Дякую за відповідь!

Але проблема: не можу знайти опис IsHungAppWindow в хелпах Дельфі. Чи не підкажеш, де можна детальніше почитати про цю API-функцію?

Онп недокументована. Не знаю, чи є в MSDN

Вікну цільового GUI-програми можна надіслати повідомлення SendMessageTimeout() зі зведеним прапором SMTO_ABORTIFHUNG та заданим значенням тайм-ауту очікування результату

Результатом буде Win32-помилка ERROR_TIMEOUT = 1460, якщо в період часу, що не перевищує заданий параметром тайм-аут, цільовий додаток, що контролюється, ніяк не відреагував на надіслане повідомлення

У 2002-Жовтень один - IsHungAppWindow - вже є. Але раніше не було, хоча працюють починаючи з 95-ої. Я сам про них свого часу на якомусь буржуазному форумі прочитав.

А Борландівському хелпі точно немає.

To MBo To Digitman To Roma

Хлопці, дякую за відповіді!

ІМХО краще все-таки з'ясувати причину.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/ishungappwindow.aspMinimum operating systems: Included in Windows 2000

Я досі намагаюся розібратися, чому прога висне. Призначення цієї проги в наступному: вона висить на машині користувача в цілодобовому режимі та відправляє/приймає дані з ораклівського сервера. Дані клієнтської машини, що надсилаються/приймаються, читаються/пишуться в локальні таблиці БД (dbf-формату). З оракловською БД працюю в клієнт/серверному режимі через Oracle Provider, використовуючи ADO. З локальної БД працював спочатку через BDE - висла, припустив, що проблема з BDE і перейшов також на ADO - продовжує виснути. Зв'язок із сервером йде по радіодоступу (клієнтські машини знаходяться на постах ДАІ, які на кілька десятків км віддалені від міста). Трафік пристойний, іненсивність обробки даних – близько десятка записів у сік. Зв'язок надійний, але іноді рветься, тому передбачив обхід цієї справи з обробкою виникаючих exceptions при розриві зв'язку і подальшому перепідключенні до сервера і прийому/відправлення черги даних, що накопичилася. Обробка даних йде паралельно трьома "потоками" через три таймери. Прога висне випадково: може кілька днів працювати без проблем, а може кілька разів на добу зависати. Закономірності якийсь поки не з'ясував (самі розумієте - на пости не боляче наїздишся, а їх всього шість, рятує RA - віддалений адмін, встановлений на кожному посту). Усе це ускладнює з'ясування причин зависання. Що я пробував: вставив пастку для будь-яких exceptions (крім оракловських, які обробляються, як уже сказав, окремим чином) через OnException - не допомогло, тому що бажаного exception невиникає; ввів протоколювання дій програми в log-файл – допомогло лише виснути, що Microsoft Provider для ODBC іноді видає зарезервовану помилку без опису, але це легко обійшов самоперезавантаження проги; дійшов від розпачу навіть до того, що вставив перед кожним рядком коду команду запису номера даного рядка в log-файл, щоб визначити після якого рядка висне - теж нічого не дало, оскільки зависання виявлялося під час роботи коду різних таймерів, тобто. у різних місцях коду. Можливо, є якісь технології для налагодження таких речей? Був дуже радий, якщо хтось чого підказав з цього приводу!

Вибачаюсь, що сумбурно виклав, якщо когось зацікавлять подробиці, пишіть – повідомлю.

> mmb32 (04.03.03 13:52) Чемниво вдячний за посилання, зараз подивлюся!

Як би я підійшов до проблеми: локальна БД у принципі все одно яка (тільки не ODBC – не люблю я його) – у всіх є недоліки. Для пересилання пакетів даних використовував FTP протокол - він із докачуванням, правами доступу тощо. Для пересилання реальногочасу даних напевно свій протокол (100мс не дуже великий трафік, хоча дивлячись скільки даних).

>Прога висне випадковим чином: може кілька днів працювати без проблем, а може кілька разів на добу зависати.

У чому полягає зависання? Наприклад, MS Windows не обмежує файловий кеш і при записі в таблицю кілька діб забиватиметься ОЗУ і свап до повного ступору.

> тільки не ODBC - не люблю я його а які надійніші альтернативи можеш порадити?

> Для пересилання пакетів даних використовував протокол FTP - > він із докачуванням, правами доступу тощо. Для пересилання realtime > даних напевно свій протокол (100мс не занадто великий трафік, ) хоча дивлячись скількиданих). Спочатку схожим чином і передбачалася робота: через TCP/IP-протокол, мій шеф нав'язував TCP/IP-навроченные і складні бібліотеки фірми-партнера, які вимагали створення додаткових модулів за сервера. З'являється дод. ланка, яка за часом взагалі ніколи була писати і тестувати, тому довелося обійтися прямим підключенням до БД, благо Oracle client все одно надсилає запити у вигляді TCP/IP-пакетів.

> У чому полягає зависання? У тому, що дані перестають прийматися/передатися клієнтом; коли в цьому випадку пробуєш викликати процес (його вікно), жодної реакції на позиви миші від процесу не відбувається, тобто повис, рідний. Пробував чекати (довго чекати), думав, зайнятий додаток обробкою даних, але в нормальному режимі, що не завис, Popup Menu вискакує відразу ж у відповідь на клацання миші.

При цьому ніякого видимого позамежного завантаження ОЗУ не відбувається, і інші процеси та програми (теж пов'язані з цією ж системою) працюють без проблем скільки завгодно часу.