Форум » [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

Петр: Извини, нет у меня ACE SDK - помочь не могу. Если ссылку (не с оффсайта) выложишь, тогда можно было бы посмотреть.

Dima: Петр http://files.mail.ru/QRP8D5

Петр: Dima пишет: но не могу ADS приручить для этого режима. бьет ошибку Дима у меня с тем ace sdk, что ты выложил все получилось нормально - без ошибок.. Делал так: обновил xHarbour с CVS, используя make_b32 пересобрал, предварительно сделав make_b32 clean. Зашел в contrib\rdd_ads. В make_b32.bat добавил set HB_DIR_ADS=e:\extlib\acesdk и установил set CFLAGS=%_CFLAGS% -I"%HB_DIR_ADS%" -tWM -DHB_THREAD_SUPPORT -DADS_LIB_VERSION=550 далее выполнил make_b32.bat clean // на всякий случай make_b32.bat потом зашел в tests в bldtest.bat прописал set HB_USER_LIBS=ace32.lib rddads.lib в ads.prg добавил в начало программы ? HB_MULTITHREAD() // тоже, на всякий случай bldtest.bat /MT ads запустил ads.exe - все Ok - это я шучу - перед тем как радоваться пришлось ads.prg немного поправить, алиасы указать..


Dima: Петр пишет: set CFLAGS=%_CFLAGS% -I"%HB_DIR_ADS%" -tWM -DHB_THREAD_SUPPORT -DADS_LIB_VERSION=550 А вот так действительно собралось ;) Спасибо !!!

Dima: Это собрался мини примерчик. В реальной задаче проблема с HBZIP.LIB во время сборки Error: Unresolved external '_errno' referenced from C:\X\LIB\HBZIP.LIB|zipfile Что править и где для MT режима ?

Петр: В CONTRIB\HBZLIB\makefile.bc есть строчка CompInheritOptsAt_ziparddll = -I$(BCB)\INCLUDE -Iinclude -I..\..\include;.;..\..\source\rtl\zlib.. после нее добавь CompInheritOptsAt_ziparddll = -tWM $(CompInheritOptsAt_ziparddll) или просто всунь -tWM где нибудь в CompInheritOptsAt_ziparddll, например CompInheritOptsAt_ziparddll = -tWM -I$(BCB)\INCLUDE и дальше привычное make_b32.bat clean make_b32.bat Компилируя с этим флагом мы заставляем linker искать стандартные C-функции в cw32mt.lib. Можно это сделать и по другому, но это самый простой путь, к тому же правильный.

Dima: Петр Спасибо , все собралось замечательно !!!!!!!!!!!!!!!

Dima: Петр пишет: PROCEDURE Main LOCAL nTask, nIdle SET BACKGROUND TASKS ON nIdle := HB_IdleAdd( {|| HB_BackGroundRun() } ) // обязательно !! nTask := HB_BackGroundAdd( {|| ShowTime() }, 1000 ) //здесь что-то делаем HB_BackGroundDel( nTask ) HB_IdleDel( nIdle ) RETURN Cделал так [pre2] PROCEDURE Main LOCAL nTask, nIdle SET BACKGROUND TASKS ON nIdle := HB_IdleAdd( {|| HB_BackGroundRun() } ) nTask := HB_BackGroundAdd( {|| Test() }, 1000 ) do while inkey(0)#27 enddo do while HB_BackGroundActive(nTask,.f.) // этот кусок кода гарантирует что функция Test завершится enddo // коректно или это нужно делать иначе ? HB_BackGroundDel( nTask ) HB_IdleDel( nIdle ) SET BACKGROUND TASKS OFF RETURN [/pre2]

Петр: Dima пишет: do while HB_BackGroundActive(nTask,.f.) // этот кусок кода гарантирует что функция Test завершится enddo // коректно или это нужно делать иначе ? Увы, не гарантирует. HB_BackGroundActive(nTask,.f.) просто сразу деактивирует задачу и все. Нужно понимать HB_BackGroundActive() дает возможность установить не то, выполняется ли сейчас функция Test, а будет ли она выполнятся по прошествии nTimeOut или не будет.

Dima: Петр Буду думать , спасибо !!!

Петр: Dima пишет: Буду думать Harbour + MT: пример [pre2]#include "hbthread.ch" MEMVAR lExit // PROCEDURE main LOCAL threadA, threadB, xResult := NIL PUBLIC lExit := .F. threadB := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @MyFuncB() ) threadA := hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @MyFuncA() ) __keyboard(chr(27)) // можно закомментировать hb_threadJoin( threadA, @xResult ) ? xResult hb_threadJoin( threadB, @xResult ) ? xResult // RETURN /* */ STATIC FUNCTION MyFuncA( ) DO WHILE inkey( 0.1 ) != 27 ENDDO lExit := .T. // RETURN LastKey() /* */ STATIC FUNCTION MyFuncB( ) LOCAL nCounter, nI DO WHILE !lExit nCounter := 0 FOR nI := 1 TO 10000 nCounter ++ NEXT nI END // RETURN nCounter[/pre2]

Петр: Ценой, просто невероятных умственных усилий удалось портировать в xHarbour [pre2]STATIC lExit // PROCEDURE main LOCAL threadA, threadB, nCounter := 0 lExit := .F. threadB := StartThread( @MyFuncB(), @nCounter ) threadA := StartThread( @MyFuncA() ) __keyboard(chr(27)) JoinThread( threadA ) ? LastKey() JoinThread( threadB ) ? nCounter // RETURN /* */ STATIC PROCEDURE MyFuncA( ) DO WHILE inkey( 0.1 ) != 27 ENDDO lExit := .T. // RETURN /* */ STATIC PROCEDURE MyFuncB( nCounter ) LOCAL nI DO WHILE !lExit nCounter := 0 FOR nI := 1 TO 10000 nCounter ++ NEXT nI ThreadSleep( 10 ) END // RETURN[/pre2] В результате выполнения этих програм, мы получаем на выходе 27 10000 А это значит, что функция (процедура) MyFuncB вполне корректно выполняется, что нам и требовалось. Можно закомментировать __keyboard(chr(27)) и поиграться

Dima: Петр пишет: threadB := StartThread( @MyFuncB(), @nCounter ) threadA := StartThread( @MyFuncA() ) __keyboard(chr(27)) Спасибо вроде разобрался ;) Но такой код срабатывает 1 раз. Для того что он работал все время нужно сделать так threadB := StartThread( @MyFuncB(), @nCounter ) threadA := StartThread( @MyFuncA() ) WaitForThreads() __keyboard(chr(27)) Не совсем понял что делает JoinThread Не проще ли так StopThread(threadA) StopThread(threadB) Или KillAllThreads()

Петр: Dima пишет: Но такой код срабатывает 1 раз. Это с __keyboard(chr(27)) - мне просто лень ESC нажимать Закомментируй и посмотри - все выполняется в цикле, как надо. Не проще ли так StopThread(threadA) StopThread(threadB) Нет, мы просто остановим потоки и в результате 10000 на экране можем не увидеть JoinThread приостанавливает выполнение главного потока, созданого по умолчанию и дожидается выполнения потока А, т.е. пока мы не нажмем ESC. Дальше JoinThread( threadB ) дожидается завершения выполнения потока Б. Ну а так ( KillAllThreads() ) убивать потоки не рекомендую вообще, за исключением действий при форсмажорных обстоятельствах.

Dima: Петр Есть проблемка тогда , даже 2 Если использовать JoinThread то прога падает Subsystem Call ....: BASE System Code .......: 3012 Default Status ....: .F. Description .......: Given thread is not valid Operation .........: JOINTHREAD Arguments .........: [ 1] = Type: P Val: A91FD0 Кроме того AdsIsServerLoaded всегда возвращает 0 (в MT режиме , в обычном все нормально)

Dima: Виноват , поправка Забыл отключить WaitForThreads() И JOINTHREAD сработал А вот с AdsIsServerLoaded проблема осталась

Dima: Очередной глюк в MT режиме :( ? AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\"+"data_nul.dbf") // локальный ADS , возвращает 0 Причем до вызова всех StartThread , AdsIsServerLoaded работает правильно ? AdsIsServerLoaded("\\servak\sys\test\data_nul.dbf") // как и положено вернет 2 , remote ADS В обычном режиме все нормально.......

Dima: Вообщем решил пока не использовать Local Ads , так как не коннектится в MT режиме

Dima: Петр А если 3 потока то как правильно сделать ? [pre2] PROCEDURE main LOCAL threadA, threadB,threadC lExit := .F. threadC := StartThread( @MyFuncC()) threadB := StartThread( @MyFuncB()) threadA := StartThread( @MyFuncA() ) JoinThread( threadA ) JoinThread( threadB ) JoinThread( threadC ) // тут иногда падает RETURN [/pre2]

Петр: threadC просто не инициилизировался. xHarbour падает и на двух потоках - убери из моего примера ThreadSleep( 10 ) и убедись: STATIC PROCEDURE MyFuncB( nCounter ) LOCAL nI DO WHILE !lExit nCounter := 0 FOR nI := 1 TO 2 nCounter ++ NEXT nI END // RETURN Что может оттянуть (предотвратить) падение - в MyFuncC добавь перед выходом ThreadSleep( nTimeOut ). Для Win nTimeOut == 20 в самый раз или проводи проверки IF hb_IsPointer(threadC) ; JoinThread( threadC ) ; ENDIF



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