Форум » [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: Петр пишет: вызов ThreadSleep(nTimeOut) с nTimeOut < 20 не желателен, хотя и возможен. Не знал , учту. Спасибо !!!

Dima: Dima пишет: [pre2] for nind=1 to len(anind) if IsValidThread(anind[nind]) JoinThread(anind[nind]) endif next [/pre2] Подумалось тут. О чем говорит факт что IsValidThread вернет .F. , о том что данный поток закончен и нет смысла делать для него JoinThread ? Скажем есть 10 потоков , в 3-х из них IsValidThread вернул .F. и JoinThread не был выполнен , к каким последствиям это может привести ?

Петр: Dima пишет: О чем говорит факт что IsValidThread вернет .F. , о том что данный поток закончен и нет смысла делать для него JoinThread ? Нет, IsValidThread вернет .F. также в том случае по какой-то причине поток не инициализировался. Dima пишет: к каким последствиям это может привести Все зависит от задачи, порой к плачевным Выполнять JoinThread не обязательно, но ты, наверное, хотел бы контролировать поведение своей программы.


Dima: Петр пишет: Выполнять JoinThread не обязательно, но ты, наверное, хотел бы контролировать поведение своей программы. Конечно хочу ! Как это правильно сделать на Xharbour применительно к этому примеру ? [pre2] STATIC lExit PROCEDURE main local threadA, threadB cls lExit := .F. threadB := StartThread( @MyFuncB()) threadA := StartThread( @MyFuncA()) JoinThread( threadA ) JoinThread( threadB ) RETURN ************************* func MyFuncB() local nind local tst:=20 local anind:=array(tst) DO WHILE !lExit for nind=1 to tst anind[nind]:=StartThread(@Test(),nind) next for nind=1 to len(anind) if IsValidThread(anind[nind]) JoinThread(anind[nind]) endif next enddo ThreadSleep(20) RETURN nil ************** Func Test(nrow) local i for i=1 to 1000 DispOutAt(nRow,10,str(i,5)) next return nil ****************** Func MyFuncA( ) DO WHILE inkey( 0.1 ) != 27 ENDDO lExit := .T. RETURN nil [/pre2]

Петр: Я уже писал - этот пример достаточно корректный. Единственное, я, наверное, делал бы проверку IsValidThread не перед JoinThread, а после StartThread.

Dima: Петр пишет: Единственное, я, наверное, делал бы проверку IsValidThread не перед JoinThread, а после StartThread Сделать , сделал только это мало что дало......... [pre2] func MyFuncB() local nind local tst local anind DO WHILE !lExit tst:=20 anind:={} for nind=1 to tst eval({|x| x:=StartThread(@Test(),nind),aadd(anind,{x,IsValidThread(x)}) }) DispOutAt(nind,45,anind[len(anind)][2],"rb+/n") // видно что все потоки валидны next for nind=1 to len(anind) if anind[nind][2] .and. IsValidThread(anind[nind][1]) // если не делать IsValidThread , упадет прога...error.log ниже JoinThread(anind[nind][1]) DispOutAt(nind,20,anind[nind][1]) DispOutAt(nind,30,nind) else DispOutAt(nind,20,anind[nind][1],"r/n") // оказывается не все валидны , почему ? DispOutAt(nind,30,nind,"r/n") endif next enddo ThreadSleep(20) RETURN nil [/pre2] Subsystem Call ....: BASE System Code .......: 3012 Default Status ....: .F. Description .......: Given thread is not valid Operation .........: JOINTHREAD Arguments .........: [ 1] = Type: P Val: 9D25A4 Involved File .....: Dos Error Code ....: 0 Running threads ...: 3 VM thread ID ......: 3 OS thread ID ......: 2096

Петр: Если внимательно читать описание JoinThread If the thread <pThreadHandle> is already terminated, the function returns immediately and does not wait. ничего подобного не должно случаться, но в xHarbour многопоточность реализована достаточно неполно, как следствие, наверное, никем не используется и следовательно ошибки не исправляются. Так, что ипользуя IsValidThread с JoinThread ты просто отсеиваешь глюки xHarbour. Некоторое время назад на форуме comp.lang.xharbour была заочная дисскусия между Пржемеком и автором реализации многопоточности xHarbour (забыл как его зовут, итальянец), кстати теперь я что-то не могу ее найти, или удалили или просто не внимателен. Найди и почитай, очень познавательно для пользователей xHarbour. Так вот, по словам Пржемека многопоточность xHarbour можна считать декларативной и он не рекомендовал бы ее использовать в реальных бизнес проектах. Один пример, в отдельных случаях из за способа обращения к таблице динамических символов прога на xHarbour использующая МТ, может сама по себе валиться после нескольких часов работы, так, что написать прогу 24х7 не удастся. P.S. Я тебя когда спрашивал, не мешают ли тебе какие-то причины (религиозные, например) использовать Harbour?

Dima: Петр пишет: Так, что ипользуя IsValidThread с JoinThread ты просто отсеиваешь глюки xHarbour Хочешь сказать что тот же код без проверок (IsValidThread) будет работать в Harbour без падений ? ЗЫ rddads в Harbour адаптирован под старые версии ADS , типа 5-ой ?

Pasha: Dima пишет: rddads в Harbour адаптирован под старые версии ADS , типа 5-ой ? Во всяком случае последнее изменение: + Added support for ADS_USE_OEM_TRANSLATION for old ads versions. в Harbour оперативно портировали

Петр: Dima пишет: Хочешь сказать что тот же код без проверок (IsValidThread) будет работать в Harbour без падений ? Я уже писал, что портирование даного примера из xHarbour в Harbour - далось мне с трудом, непонятные глюки на ровном месте. [pre2]2008-10-07 09:33 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * include/hbextern.ch * source/rtl/inkey.c + Added HB_KEYCLEAR() a documented function equivalent to "CLEAR TYPEAHEAD" command, or undocumented __KEYBOARD() function. * contrib/rddads/rddads.h * contrib/rddads/ads1.c + Added support for ADS_USE_OEM_TRANSLATION for old ads versions. Borrowed from xhb/Pavel Tsarenko. [/pre2]

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] Скачал и собрал Harbour. А вот данный пример собрать не могу. В Xharbour как то попроще это ;) Кинул пример в папку Tests , запускаем bld_b32.bat m1 /MT и получаем ошибку в 13 строке , аргумент error hb_threadJoin , хотя синтаксис верен. Пробнул собрать с помощью hbmake Результат Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland obj\m1.c: Error E2451 obj\m1.c 25: Undefined symbol 'HB_FS_MEMVAR' Error E2141 obj\m1.c 25: Declaration syntax error Error E2190 obj\m1.c 25: Unexpected } Error E2190 obj\m1.c 25: Unexpected } Error E2040 obj\m1.c 25: Declaration terminated incorrectly Error E2190 obj\m1.c 25: Unexpected } Error E2190 obj\m1.c 25: Unexpected } Error E2040 obj\m1.c 25: Declaration terminated incorrectly Error E2451 obj\m1.c 38: Undefined symbol 'hb_vm_SymbolInit_M1' *** 9 errors in Compile ***

Петр: Dima пишет: Скачал и собрал Harbour make_b32.bat make_b32.bat install bld_b32.bat m1 /MT - неправильно нужно в bld_b32.bat добавить set HB_MT=MT можно также set C_USR= set PRG_USR= set HB_USER_LIBS=rddads hbcurl

Dima: Петр пишет: нужно в bld_b32.bat добавить set HB_MT=MT получил тот же результат Dima пишет: аргумент error hb_threadJoin

Петр: Дима Ты слинковал программу в ST режиме, отсюда и падения добавь таки set HB_MT=MT P.S. Для проверки в каком режиме работает HVM ST или MT используй hb_mtvm()

Dima: Петр пишет: добавь таки set HB_MT=MT Грю же что добавил ;) Странно но в батнике bld.bat эти строки не срабатывают похоже , временно сделал так rem if "%HB_MT%" == "MT" set _HBVM_LIB=hbvmmt rem if not "%HB_MT%" == "MT" set _HBVM_LIB=hbvm set _HBVM_LIB=hbvmmt Все собралось и работает отлично в отличие от Xharbour !!!

Dima: Петр Однако при 20 запущенных потоках проц грузится очень конкретно. Пришлось в цикл воткнуть hb_idleSleep(0.001). Может есть какой то другой способ разгрузки процессора ?

Петр: О процессоре - охотно верю. В реальной жизни, не в примере нужно вызывать hb_releaseCPU()

Dima: Петр Понял , спасибо. Пересобрал и оставил крутится пару часов. Надеюсь не свалится :)

Dima: Петр пишет: Так, что ипользуя IsValidThread с JoinThread IsValidThread реализован в Harbour ? PS Как крыску отключить в Harbour ? Так не катит request HB_NOMOUSE

Петр: Dima пишет: IsValidThread реализован в Harbour Нет, а зачем она тебе? Спрятать курсор? IMHO только WAPI ShowCursor() #pragma BEGINDUMP #include <windows.h> HB_FUNC( SHOWMOUSECURSOR ) { ShowCursor( hb_parl(1) ); } #pragma ENDDUMP



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