Автор | Сообщение |
|
| |
Пост N: 887
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.09.08 16:05. Заголовок: [translate] BackGround
Кто то может перевести 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
[только новые]
|
|
|
| постоянный участник
|
Пост N: 521
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.10.08 18:38. Заголовок: Извини, нет у меня A..
Извини, нет у меня ACE SDK - помочь не могу. Если ссылку (не с оффсайта) выложишь, тогда можно было бы посмотреть.
|
|
|
|
| |
Пост N: 977
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.10.08 18:48. Заголовок: Петр http://files.m..
|
|
|
|
| постоянный участник
|
Пост N: 522
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.10.08 20:43. Заголовок: Dima пишет: но не м..
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 немного поправить, алиасы указать..
|
|
|
|
| |
Пост N: 979
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.10.08 10:09. Заголовок: Петр пишет: set CFL..
Петр пишет: цитата: | set CFLAGS=%_CFLAGS% -I"%HB_DIR_ADS%" -tWM -DHB_THREAD_SUPPORT -DADS_LIB_VERSION=550 |
| А вот так действительно собралось ;) Спасибо !!!
|
|
|
|
| |
Пост N: 980
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.10.08 10:22. Заголовок: Это собрался мини пр..
Это собрался мини примерчик. В реальной задаче проблема с HBZIP.LIB во время сборки Error: Unresolved external '_errno' referenced from C:\X\LIB\HBZIP.LIB|zipfile Что править и где для MT режима ?
|
|
|
|
| постоянный участник
|
Пост N: 523
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.10.08 14:17. Заголовок: В CONTRIB\HBZLIB..
В 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. Можно это сделать и по другому, но это самый простой путь, к тому же правильный.
|
|
|
|
| |
Пост N: 982
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.10.08 14:56. Заголовок: Петр Спасибо , все ..
Петр Спасибо , все собралось замечательно !!!!!!!!!!!!!!!
|
|
|
|
| |
Пост N: 983
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.10.08 15:59. Заголовок: Петр пишет: PROCEDU..
Петр пишет: цитата: | 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делал так 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
|
|
|
|
| постоянный участник
|
Пост N: 524
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.10.08 19:10. Заголовок: Dima пишет: do whi..
Dima пишет: цитата: | do while HB_BackGroundActive(nTask,.f.) // этот кусок кода гарантирует что функция Test завершится enddo // коректно или это нужно делать иначе ? |
| Увы, не гарантирует. HB_BackGroundActive(nTask,.f.) просто сразу деактивирует задачу и все. Нужно понимать HB_BackGroundActive() дает возможность установить не то, выполняется ли сейчас функция Test, а будет ли она выполнятся по прошествии nTimeOut или не будет.
|
|
|
|
| |
Пост N: 984
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.10.08 19:25. Заголовок: Петр Буду думать , ..
Петр Буду думать , спасибо !!!
|
|
|
|
| постоянный участник
|
Пост N: 525
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.10.08 21:12. Заголовок: Dima пишет: Буду ду..
Dima пишет: Harbour + MT: пример #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
|
|
|
|
|
| постоянный участник
|
Пост N: 526
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.10.08 22:42. Заголовок: Ценой, просто неверо..
Ценой, просто невероятных умственных усилий удалось портировать в xHarbour 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 В результате выполнения этих програм, мы получаем на выходе 27 10000 А это значит, что функция (процедура) MyFuncB вполне корректно выполняется, что нам и требовалось. Можно закомментировать __keyboard(chr(27)) и поиграться
|
|
|
|
| |
Пост N: 985
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.10.08 11:05. Заголовок: Петр пишет: threadB..
Петр пишет: цитата: | 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()
|
|
|
|
| постоянный участник
|
Пост N: 527
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.10.08 12:36. Заголовок: Dima пишет: Но тако..
Dima пишет: цитата: | Но такой код срабатывает 1 раз. |
| Это с __keyboard(chr(27)) - мне просто лень ESC нажимать Закомментируй и посмотри - все выполняется в цикле, как надо. цитата: | Не проще ли так StopThread(threadA) StopThread(threadB) |
| Нет, мы просто остановим потоки и в результате 10000 на экране можем не увидеть JoinThread приостанавливает выполнение главного потока, созданого по умолчанию и дожидается выполнения потока А, т.е. пока мы не нажмем ESC. Дальше JoinThread( threadB ) дожидается завершения выполнения потока Б. Ну а так ( KillAllThreads() ) убивать потоки не рекомендую вообще, за исключением действий при форсмажорных обстоятельствах.
|
|
|
|
| |
Пост N: 986
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.10.08 13:02. Заголовок: Петр Есть проблемка..
Петр Есть проблемка тогда , даже 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 режиме , в обычном все нормально)
|
|
|
|
| |
Пост N: 987
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.10.08 13:06. Заголовок: Виноват , поправка З..
Виноват , поправка Забыл отключить WaitForThreads() И JOINTHREAD сработал А вот с AdsIsServerLoaded проблема осталась
|
|
|
|
| |
Пост N: 989
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.10.08 15:23. Заголовок: Очередной глюк в MT ..
Очередной глюк в MT режиме :( ? AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\"+"data_nul.dbf") // локальный ADS , возвращает 0 Причем до вызова всех StartThread , AdsIsServerLoaded работает правильно ? AdsIsServerLoaded("\\servak\sys\test\data_nul.dbf") // как и положено вернет 2 , remote ADS В обычном режиме все нормально.......
|
|
|
|
| |
Пост N: 990
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.10.08 16:36. Заголовок: Вообщем решил пока н..
Вообщем решил пока не использовать Local Ads , так как не коннектится в MT режиме
|
|
|
|
| |
Пост N: 995
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.10.08 08:56. Заголовок: Петр А если 3 поток..
Петр А если 3 потока то как правильно сделать ? PROCEDURE main LOCAL threadA, threadB,threadC lExit := .F. threadC := StartThread( @MyFuncC()) threadB := StartThread( @MyFuncB()) threadA := StartThread( @MyFuncA() ) JoinThread( threadA ) JoinThread( threadB ) JoinThread( threadC ) // тут иногда падает RETURN
|
|
|
|
| постоянный участник
|
Пост N: 528
Зарегистрирован: 09.10.06
|
|
Отправлено: 13.10.08 13:04. Заголовок: xHarbour падает и на..
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
|
|
|
Ответов - 96
, стр:
1
2
3
4
5
All
[только новые]
|
|