Форум » [x]Harbour » [translate] BackGround » Ответить

[translate] BackGround

Dima: Кто то может перевести help к этим функциям на русский ? HB_BackGroundActive() Queries and/or changes the activity of a single background task. HB_BackGroundAdd() Adds a new background task. HB_BackGroundDel() Removes a background task from the internal task list. HB_BackGroundReset() Resets the internal counter of background tasks. HB_BackGroundRun() Enforces execution of one or all background tasks. HB_BackGroundTime() Queries or changes the wait interval in milliseconds after which the task is executed. HB_IdleAdd() Adds a background task for being executed during idle states. HB_IdleDel() Removes a task from the list of idle tasks. HB_IdleReset() Resets the internal counter of idle tasks. HB_IdleSleep() Halts idle task processing for a number of seconds. HB_IdleSleepMSec() Queries or changes the default time interval for idle task processing. HB_IdleState() Signals an idle state. HB_IdleWaitNoCPU() Toggles the mode for CPU usage in Idle wait states. SET BACKGROUND TASKS Enables or disables the activity of background tasks. SET BACKGROUNDTICK Defines the processing interval for background tasks.

Ответов - 96, стр: 1 2 3 4 5 All

Dima: Петр пишет: Спрятать курсор? IMHO только WAPI ShowCursor() Спасибо , но не сработало. Петр пишет: Dima пишет: цитата: IsValidThread реализован в Harbour Нет, а зачем она тебе? Просто хотел подстраховаться от возможного вылета в hb_threadJoin(), так как задача будет работать 24 часа в сутки. И еще вопрос. [pre2] for i=1 to 20 hb_threadStart(@Test(),i) next [/pre2] Каждый поток обрабатывается в своей области памяти ? Не будет конфликта локальных и привате переменных объявленных в функции Test() ?

Петр: ShowCursor( .F. ) катит? Странно.. Проверяй thread на hb_isPointer(thread) != .F. Dima пишет: Каждый поток обрабатывается в своей области памяти ? Смотри tests\mt\mttest08.prg Локальных не будет, а там как напишешь , т.е. с какими параметрами вызовешь hb_threadStart. Статические переменные обьявляй как thread static (если нужно)

Dima: Петр Подскажи дружище что тут можно сделать ! [pre2] for nind=1 to 50 hb_threadStart(@Test(),nind) next Func Test(nid) USE test SHARED Alias &( "Test"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test1"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test2"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test3"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test4"+ Alltrim( Str(nId)) ) NEW * тут что то делаем * и в какой то момент можем получить такой то Alias не существует * при обращении к какой то базе. * Почему ? * Куда и какой костыль вставить ? :) close ("Test"+ Alltrim( Str(nId))) close ("Test1"+ Alltrim( Str(nId))) close ("Test2"+ Alltrim( Str(nId))) close ("Test3"+ Alltrim( Str(nId))) close ("Test4"+ Alltrim( Str(nId))) return nil [/pre2] PS ADS. Что интерестно , то работает то нет..........


Dima: Если вставить костыль , то работает , но это наверное не выход [pre2] for nind=1 to 50 hb_threadStart(@Test(),nind) hb_idleSleep(5) next [/pre2]

Петр: Dima пишет: for nind=1 to 50 hb_threadStart(@Test(),nind) next Это реальная ситуация? Тебе действительно нужно вызывать 50 потоков? И зачем одну базу открывать столько раз. По коду я вижу, что ты даже не проверяешь, успешно ли открыта база.

Dima: Петр пишет: Это реальная ситуация? Тебе действительно нужно вызывать 50 потоков? Ситуация почти реальна. Сколько зайдет запросов столько будет и потоков. Запросов может быть от 1 до 50 Открытие базы я конечно же проверяю , дал пример что бы ясно было чего делаю. Если хоть одна база не открыта я выхожу из функции Test. Возможно дело в кол-ве одновременно открываемых файлов ? Тогда что нужно исправить ? Реально в одном потоке я открываю 20 баз и 15 индексных файлов.

Петр: А упростить себе жизнь и держать таблицы открытыми?

Dima: Петр пишет: А упростить себе жизнь и держать таблицы открытыми? Не думал про это , теперь подумаю ! И все же почему падает пример ?

Петр: Хороший вопрос, но у меня сейчас нет на него ответа. Надо тестировать. Хотя бы найти, чей это косяк ADS или Harbour. Посмотрю на досуге. Но ясно одно, такие программы должны быть тщательно спроектированы и реализованы.

Dima: В реальном примере падает даже на 3 потоках (не всегда) с той же ошибкой "Alias не существует" При чем падает в разных местах и закономерности не обнаружил. Базы все открыты 100 % (по той схеме о которой писал выше) Есть причины не держать базы все время открытыми. Где то читал на форуме http://www.fivetechsoft.com/forums что ADS не работает в MT режиме или работает не корректно.....но пока не вижу ссылки на тему. PS В отличие от Xharbour , Ads спецом для MT режима я не пересобирал , все собралось и так. Возможно в этом причина ?

Dima: Dima пишет: [pre2] Func Test(nid) USE test SHARED Alias &( "Test"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test1"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test2"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test3"+ Alltrim( Str(nId)) ) NEW USE test SHARED Alias &( "Test4"+ Alltrim( Str(nId)) ) NEW * тут что то делаем * и в какой то момент можем получить такой то Alias не существует * при обращении к какой то базе. * Почему ? * Куда и какой костыль вставить ? :) close ("Test"+ Alltrim( Str(nId))) close ("Test1"+ Alltrim( Str(nId))) close ("Test2"+ Alltrim( Str(nId))) close ("Test3"+ Alltrim( Str(nId))) close ("Test4"+ Alltrim( Str(nId))) return nil [/pre2] Опытным путем установил , что если nid локальная переменная то прога может падать. Если Private то не падает. Если так может упасть Func Test(nid) Так пока не упала ни разу ;) Func Test() param nid PS Рано радовался...............меньше стало падать но все равно падает

Петр: Dima пишет: В отличие от Xharbour , Ads спецом для MT режима я не пересобирал , все собралось и так. Возможно в этом причина ? Скорее всего нет, я склоняюсь к мысли, что это проблемы ADS - не успевает отрабатывать запросы. for nind=1 to 50 hb_threadStart(@Test(),nind) next с RDDCDX отрабатывает без проблем Меняй схему работы - запросы ставь в очередь и обрабатывай последовательно. И hb_idleSleep() - это не костыль. А вообще задача у тебя на каком процессоре крутится - есть реальная многопроцессорность (ядерность) или все средствами OS разруливается?

Dima: Петр пишет: Меняй схему работы - запросы ставь в очередь и обрабатывай последовательно Видимо так и придется делать , хотя задачу ставили что бы все крутилось одновременно. Есть около 50 коммерческих агентов которые ездят с ноутбуками и собирают заявки от своих клиентов. По мере необходимости каждый из агентов сбрасывает на ftp свои заявки + могут делать запросы на получение прайс листов , остатков , актуального справочника своих клиентов и тд и тп. Именно эти запросы и хотелось пустить в потоки..........но , похоже не выйдет так как ADS выбрыкивается. Жаль. Задача крутится на самом обычном процессоре под XP

Петр: Dima пишет: Задача крутится на самом обычном процессоре под XP Почитай в справке ADS - Number of Worker Threads. Для 50 рабочих потоков нужно, как минимум 4 CPU (физических или логических).

Dima: Петр Понял. Спасибо ! Буду обрабатывать запросы последовательно.

Dima: Глянул Ads_err.dbf , когда прога падала лезут одни и те же ошибки [pre2] THREAD_NUM ERR_CLASS ERR_CODE ADS_SOURCE SRC_LINE 111295936 0 16 dbf.c 269 111295936 0 128 dbf.c 270 111295936 7000 7040 dbf.c 280 111879232 0 16 dbf.c 269 111879232 0 128 dbf.c 270 111879232 7000 7040 dbf.c 280 [/pre2] Так и не понял что за ERR_CODE 128 , в доке не нашел.



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