Форум » [x]Harbour » Парадокс проверки... или кривой код ? » Ответить

Парадокс проверки... или кривой код ?

Andrey: Всем привет. Столкнулся с пробемой запуска программы месяца 2 назад. Небольшое пояснение: в фирме стоит моя сетевая программа. В качестве антивируса официальный DRWEB на всех компах, обновлется через инет. Проверку моей папки ВООБЩЕ отключили. На 2 компах (98 и ХР) моя прога запускается сразу (меньше минуты), а на других 3 (ХР) - тормоза, запуск примерно минут через 20 !!! Грешил на сеть, свич и т.д. А ларчик просто открылся. Сделал трасировку задачи (написал запись в лог-файл время выполнения всех функций при запуске). И выяснил, что единственный тормоз это функция - Проверки запуска предыдущей копии программы !!! Время ее выполнения 20 мнут в среднем... Почему, непонятно ? Код программы хХарбор 1.0+BCC привожу :http://zalil.ru/30765956 Кто подскажет как исправить систему или код ? Переставлять систему не могу, стоит банк-клиент, бухгалтерская прога и т.д. Все компы рабочие, не тормозят...

Ответов - 51, стр: 1 2 3 All

PSP: Петр пишет: Читать до просветления Мда... ФайндВиндоу несколько не то, как оказалось... Читаем дальше. Спасибо, Петр!

PSP: Петр, где можно прочитать о функциях работы с мютексами в Харборе (hb_mutexCreate() и связанные с ней...)?

Петр: PSP пишет: где можно прочитать о функциях работы с мютексами в Харборе Даже и не знаю, что написать. Если мне не изменяет память, была в почтовой рассылке harbour-dev переписка между Пржемеком (Przemyslaw Czerpak) и Миндаугасом (Mindaugas Kavaliauskas) на эту тему. Но у меня ссылки нет.


Vlad04: Решить проблему запуска не более одного экземпляра программы можно по-другому, без поиска окон. Запускаемый экземпляр программы открывает монопольно на компе ( при чем не важно где находится exe в сети или на рабочей станции) сигнальную таблицу, к примеру ...\temp\start.dbf. Если ее нет - создает.Второй экземпляр программы то же повторить не сможет. Естестственно, надо предусмотреть в подобных случаях обработку ошибок, выдачу сообщений и т.п. , чтобы пользователю было ясно, что он неправильно сделал. Подобным образом можно контролировать и вход по одному ЛОГИНУ не более одного человека.

Dima: PSP http://clipper.borda.ru/?1-4-0-00000369-000-0-0 см. IsExeRunning

PSP: Петр, спасибо! Дима, спасибо за ссылку! Я подразумевал некий мануал... Понимаю, что далеко не всегда он имеется.

Andrey: Vlad04 пишет: Решить проблему запуска не более одного экземпляра программы можно по-другому, без поиска окон. Запускаемый экземпляр программы открывает монопольно на компе ( при чем не важно где находится exe в сети или на рабочей станции) сигнальную таблицу, к примеру ...\temp\start.dbf. Если ее нет - создает.Второй экземпляр программы то же повторить не сможет. Такое же я делал на Клипере. Иногда сбоит. При слете программы на некоторых системах, включая ХР база остается блокированной. Юзера не знали что делать... Помогала только перезагрузка компа. Переделал на другой вариант, который представлен выше. Разные программы с таким вариантом "определения повторного запуска" работает на более 100 компов в различных городах. И только в ОДНОМ месте у меня такой "затык" !!!

Vlad04: И только в ОДНОМ месте у меня такой "затык" !!! Значит в операционке "косяки". Переустановить

PSP: Vlad04 пишет: Значит в операционке "косяки". Переустановить Это не на одном компе, как я понял. Это - "в ОДНОМ месте" на нескольких компах.

Andrey: PSP пишет: Это не на одном компе, как я понял. Это - "в ОДНОМ месте" на нескольких компах. Да, правильно. В одно месте на 6-ти компах. Планирую привезти туда свой ноутбук (акция - "подцепи себе трояна" ) и посмотреть как будет работать программа на чистой операционке.

PSP: А вот все-таки, Андрей, ты локально запускаешь прогу или из сети?

Andrey: PSP пишет: А вот все-таки, Андрей, ты локально запускаешь прогу или из сети? Прога сетевая. Клиентское место (ехе-ник) запускаю локально.

SergejKis: Андрей, воспользуйся CreateFile из Win API с атрибутом FILE_ATTRIBUTE_TEMPORARY. Файл существкет пока есть его handler, т.е. пока работает приложение (или сам не закроешь handler).

Петр: Andrey пишет: Планирую привезти туда свой ноутбук Я бы для начала, запустил компьютер (один из тех 6) в безопасном режиме с поддержкой сетевых служб и посмотрел на реакцию программы. Очень интересно, у них там на каждом рабочем месте запускают FireBird и MySQL, сервер лицензий FineReader, Radmin и TeamViewer, плюс ко всему Skype и ISQ?

Andrey: Петр пишет: Очень интересно, у них там на каждом рабочем месте запускают FireBird и MySQL, сервер лицензий FineReader, Radmin и TeamViewer, плюс ко всему Skype и ISQ? FireBird и MySQL - только на этом удаленном компе, удалил уже их. Radmin - на всех компах TeamViewer + Skype - только на этом компе, чтоб через инет доступ был, по очистке. ISQ - только на нем.

Vlad04: SergejKis воспользуйся CreateFile из Win API с атрибутом FILE_ATTRIBUTE_TEMPORARY. А в коде Харбор как это будет выглядеть?

Петр: Vlad04 пишет: А в коде Харбор как это будет выглядеть? А в Harbour есть функция hb_dbCreateTemp() hb_dbCreateTemp() - create temporary table which are automatically deleted on close. All indexes and memo files for such tables are also in temporary files and automatically deleted on close. Please remember that Harbour uses OS functions to create temporary files so it's installation dependent how much disk space is available for them. Some RDDs may also do not create temporary files but keep everything in memory if they decide it's more efficient.

Vlad04: ок. Спасибо, учтем

PSP: Петр пишет: А в Harbour есть функция hb_dbCreateTemp() Она вряд ли подойдет для целей, обсуждаемых в этой теме. Файл создается со случайным именем, узнать которое невозможно. [pre2]hb_dbCreateTemp( <cAlias>, <aStruct>, <cRDD>, <cCodePage>, <nConnection> ) -> <lSuccess>[/pre2]

Петр: PSP пишет: Она вряд ли подойдет для целей, обсуждаемых в этой теме. Файл создается со случайным именем, узнать которое невозможно. Если сильно хочется, то почему нет? hb_dbCreateTemp, hb_FTempCreate, hb_FTempCreateEx + куча функций для роботы с файлами, добавленных в Harbour - используйте, как душа пожелает Возвращаясь к воспользуйся CreateFile из Win API с атрибутом FILE_ATTRIBUTE_TEMPORARY. атрибут FILE_ATTRIBUTE_TEMPORARY можно установить так. [pre2]#include "fileio.ch" FUNCTION test() LOCAL hFile, cName, nAttr := 20 cName := hb_dirBase() + "~semaphore" FErase( cName ) hFile := hb_FCreate( cName, FC_HIDDEN, FO_EXCL + FO_EXCLUSIVE ) IF hFile != F_ERROR FWrite( hFile, "RkN" + hb_eol(), 5 ) wapi_SetFileAttributes( cName, HB_FA_NOTINDEXED + HB_FA_TEMPORARY ) hb_FGetAttr( cName, @nAttr ) IF nAttr != 0x2120 ? "Sorry again.." RETURN .F. ENDIF RETURN .T. ENDIF RETURN .F. #pragma BEGINDUMP #include "hbapi.h" #include "hbvm.h" #include "hbapifs.h" #if defined( HB_OS_WIN ) #include "windows.h" HB_FUNC( WAPI_SETFILEATTRIBUTES ) { const char * pszFileName = hb_parcx( 1 ); HB_FATTR ulAttr = hb_parnl( 2 ); HB_BOOL fResult; char * pszFree; HB_TRACE(HB_TR_DEBUG, ("wapi_SetFileAttributes(%s, %u)", pszFileName, ulAttr)); pszFileName = hb_fsNameConv( pszFileName, &pszFree ); hb_vmUnlock(); { LPTSTR lpFilename = HB_TCHAR_CONVTO( pszFileName ); DWORD dwFlags = FILE_ATTRIBUTE_ARCHIVE; if( ulAttr & HB_FA_HIDDEN ) dwFlags |= FILE_ATTRIBUTE_HIDDEN; if( ulAttr & HB_FA_NORMAL ) dwFlags |= FILE_ATTRIBUTE_NORMAL; if( ulAttr & HB_FA_NOTINDEXED ) dwFlags |= FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; if( ulAttr & HB_FA_OFFLINE ) dwFlags |= FILE_ATTRIBUTE_OFFLINE; if( ulAttr & HB_FA_READONLY ) dwFlags |= FILE_ATTRIBUTE_READONLY; if( ulAttr & HB_FA_SYSTEM ) dwFlags |= FILE_ATTRIBUTE_SYSTEM; if( ulAttr & HB_FA_TEMPORARY ) dwFlags |= FILE_ATTRIBUTE_TEMPORARY; fResult = SetFileAttributes( lpFilename, dwFlags ) != 0; hb_fsSetIOError( fResult, 0 ); HB_TCHAR_FREE( lpFilename ); } hb_vmLock(); if( pszFree ) hb_xfree( pszFree ); hb_retl( fResult ); } #endif #pragma ENDDUMP [/pre2] Из-за кросплатформенности hb_FSetAttr просто игнорирует некоторые специфичные файловые атрибуты, по этому пришлось написать обертку к SetFileAttributes(). Результат дополнительно можно перепроверить так (XP и выше) fsutil usn readdata ~semaphore или в Far-e Файлы->Атрибуты файлов или другим доступным вам методом Почитать о атрибутах файла можна здесь click here В результате неоднократных правок я тут удалил неосторожно несколько строк, так что сл. несколько постов могут показаться бесмысленными .



полная версия страницы