Что использовать для пвышения надёжности?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Павел
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.10.2003 (Ср) 8:25
Откуда: Мос обл

Что использовать для пвышения надёжности?

Сообщение Павел » 18.10.2004 (Пн) 10:58

Помогите советом пожалуйста.
Есть приложение, которое должно подчитывать данные из файлов и пихать в базу (MS SQL). Файлы с данными обновляются с разными интервалами из другой системы. Процессы преобразования должны идти как бы паралельно.
Написал я приложение, проверка обновления каждого файла происходит по собственному таймеру, если файл обновился, то читаются данные.
Иногда работает криво, при ошибках чтения файла либо всё приложение вылетает, либо "висит" функция преобразования на одном таймере и остальные таймеры из-за этого вовремя не выполняют свои функции. :?
Как повысить надёжность? Написать отдельные exe для каждого файла (возникают проблемы слежения за работой функций перекачки данных), попробовать многопотоковость (сотворил тест, но terminatethread не уничтожает поток :( ), что-то ещё? :?:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2004 (Пн) 11:03

Мультитрединг, в принципе, должен подойти. Только:
- постарайся не вызывать из дополнительных потоков свойства никаких объектов. Если нужно сделать это, реализуй в виде postmessage с последующим сабклассингом объекта
- процедура, по адресу которой создаётся трэд, имеет один параметр типа long, и возвращает тоже Long. Функция это, а не то, что зачастую пишут в примерах.
- трэд уничтожится не тогда, когда выполнится terminatethread. Нужно ещё, чтобы закрылись все его handle. Ты вызываешь closehandle для hThread?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Что использовать для пвышения надёжности?

Сообщение codemaster » 18.10.2004 (Пн) 12:36

Павел писал(а):Иногда работает криво, при ошибках чтения файла либо всё приложение вылетает, либо "висит" функция преобразования на одном таймере и остальные таймеры из-за этого вовремя не выполняют свои функции. :?
Как повысить надёжность?



Выполни два условия

1. Правильно обработай ошибки чтения файла
2. нормальный Log

P.S. Как реализованы таймеры?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.10.2004 (Пн) 13:16

Err не используй...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Павел
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.10.2003 (Ср) 8:25
Откуда: Мос обл

Сообщение Павел » 19.10.2004 (Вт) 8:23

2GSerg
1) А к глобальным переменным обращаться можно?
2) Да, у меня функция.
3) Добавил уничтожение хендлов, помогло, но частично :) Теперь после выхода из приложения форма закрывается, а само оно остаётся (в диспетчере задач его видно :?) как с этим справиться?
Может кинешь ссылку на толковый пример?

2сodemaster
1)С этого и начал :) Проблема тут в том, что файлы пишутся из ОС QNX через SMB. Из-за этого возникают ошибки, которые я отловить не могу. Приложение "вылетает" не издав и звука, причём я знаю ГДЕ, лог-то есть :), но вот почему? Иногда аналогично происходят "зависания". Решил, что нужно сделать так чтобы "вылет" одной задачи на другие не влиял.
2) Вот так:
Код: Выделить всё
Private Sub Timer1_Timer ()
<...>
End Sub

Private Sub Timer2_Timer ()
<...>
End Sub
...

вроде ничего особенного... :)

2Sebas
А что использовать-то, Error ? :roll:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.10.2004 (Вт) 9:03

Вообще-то ничего сложного у тебя нет.

Зачем у тебя несколько таймеров совсем непонятно - достаточно одного, периодически запускающего проверку. А уже в функции проверки смотреть надо ли проверять данный файл, если время подошло то проверяем/обрабатываем.

Вылетать может из-за того что файлы открыты другим приложением, а обработки ошибок у тебя, похоже, не делается.

Так что все что надо - правильно сделать обработку ошибок.

>> Мультитрединг, в принципе, должен подойти.

Да нафига он ему?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2004 (Вт) 9:53

Ну он спросил, как вариант.
Почему, действительно, нет? :)

1. Если они только на чтение (константы там управляющие, задаваемые главным потоком до старта дочерних и потом не изменемые) - то да, без ограничений. Если же нужно менять, то тогда и чтение, и запись оных нужно заключать в блоки синхронизации (выбирай: critical sections, events, mutexes...)
2. Красавец! :)
3. Ну, например, глянь Waiter! в проектах :wink: Вообще, тред заканчивается, когда подходит к концу его процедура. А функция уничтожения просто говорит системе, что тред собирается сдохнуть, но когда именно это произойдёт, не очень ясно :) Так что выполненная в процедуре команда exit function как раз и приведёт к завершению треда. closehandle при этом никто не отменял :)


Ну а в целом - я бы, конечно, попытался сначала выяснить, таки-почему всё-таки вылетает :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 19.10.2004 (Вт) 10:32

Павел писал(а):
2сodemaster
1)С этого и начал :) Проблема тут в том, что файлы пишутся из ОС QNX через SMB. Из-за этого возникают ошибки, которые я отловить не могу. Приложение "вылетает" не издав и звука, причём я знаю ГДЕ, лог-то есть :), но вот почему? Иногда аналогично происходят "зависания". Решил, что нужно сделать так чтобы "вылет" одной задачи на другие не влиял.
2) Вот так:
Код: Выделить всё
Private Sub Timer1_Timer ()
<...>
End Sub

Private Sub Timer2_Timer ()
<...>
End Sub
...

вроде ничего особенного... :)



Судя по описанию и коду твое приложение работает примерно так:

Открыт "глобальный" коннект к SQL БД
На форме в таймерах идет разбор принятых данных
и через "глобальный" коннект все пишется в БД?

Как синхронизируются таймеры ?
Файлов 2 ?

Напиши больше
Что касается многопоточности то есть много подводных камней

Павел
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.10.2003 (Ср) 8:25
Откуда: Мос обл

Сообщение Павел » 20.10.2004 (Ср) 8:15

Ну, раз пошла такая пьянка... :)
Описание задачи:
- есть комп под управлением OC QNX, с которого через SMB в расшаренную папку сервера (под Windows) записываются dbf файлы с данными (порядка 500-800 строк каждый)
- всего 7 файлов, записываются с разными интервалами, один - раз в 30 сек, два - раз в мин, и остальные - раз в час
- имена файлов фиксированные, т.е. файлы постоянно перезаписываются
Задача: нужно приложение, которое будет периодически подчитывать данные и пихать их в MS SQL для доступа по локалке.

Что делал я:
- Сначала написал программу тупо через один таймер, проверка раз в 5 сек всех файлов по очереди, для доступа и к dbf и к SQL использовал ADO, глобальные коннекты. Стали возникать пропуски в данных, выяснил что периодически происходит так, что чтение данных раз в час выполняются дольше 25 сек и данные 30 сек уже успевают обновиться
- Добавил таймеров, в каждый прописал обработку своего файла, пропуски вроде исчезли, но иногда возникали ошибки при чтении (из-за совместного доступа) , при этом програма может зависнуть надолго на чтении одного файла, а остальные таймеры, соответственно, ждут завершения чтения.
- Возникла мысль распаралелить задачи, дабы всего этого избежать.

Обработка ошибок открытия файла у меня есть, а вот что с зависами делать, я пока не знаю... :?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.10.2004 (Ср) 8:31

- Сначала написал программу тупо через один таймер


Это правильно - больше таймеров для этой задачи даром не нужно.
Это как лампочку вшестером вкручивать...

, проверка раз в 5 сек всех файлов по очереди, для доступа и к dbf и к SQL использовал ADO, глобальные коннекты.


Коннект достаточно открыть только один (в начале работы программы) - к этой папке. Проверять наличие файла, если есть то делаем что нужно, после чего (если все успешно) просто удаляем этот файл. Чтобы не было большого зависания из-за совместного доступа для поставь CommandTimeout в 1..2 секунды (по умолчанию он равен 30 секундам - отсюда у тебя и были пропуски).

И только-то...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Павел
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 01.10.2003 (Ср) 8:25
Откуда: Мос обл

Сообщение Павел » 20.10.2004 (Ср) 15:02

Всем спасибо. Буду пробовать. :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 8

    TopList