Автор | Сообщение |
|
| |
Пост 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: 1023
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.08 16:00. Заголовок: Петр пишет: вызов T..
Петр пишет: цитата: | вызов ThreadSleep(nTimeOut) с nTimeOut < 20 не желателен, хотя и возможен. |
| Не знал , учту. Спасибо !!!
|
|
|
|
| |
Пост N: 1024
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.08 16:48. Заголовок: Dima пишет: for nin..
Dima пишет: цитата: | for nind=1 to len(anind) if IsValidThread(anind[nind]) JoinThread(anind[nind]) endif next |
| Подумалось тут. О чем говорит факт что IsValidThread вернет .F. , о том что данный поток закончен и нет смысла делать для него JoinThread ? Скажем есть 10 потоков , в 3-х из них IsValidThread вернул .F. и JoinThread не был выполнен , к каким последствиям это может привести ?
|
|
|
|
| постоянный участник
|
Пост N: 551
Зарегистрирован: 09.10.06
|
|
Отправлено: 21.10.08 18:01. Заголовок: Dima пишет: О чем г..
Dima пишет: цитата: | О чем говорит факт что IsValidThread вернет .F. , о том что данный поток закончен и нет смысла делать для него JoinThread ? |
| Нет, IsValidThread вернет .F. также в том случае по какой-то причине поток не инициализировался. Dima пишет: цитата: | к каким последствиям это может привести |
| Все зависит от задачи, порой к плачевным Выполнять JoinThread не обязательно, но ты, наверное, хотел бы контролировать поведение своей программы.
|
|
|
|
| |
Пост N: 1025
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.10.08 18:09. Заголовок: Петр пишет: Выполня..
Петр пишет: цитата: | Выполнять JoinThread не обязательно, но ты, наверное, хотел бы контролировать поведение своей программы. |
| Конечно хочу ! Как это правильно сделать на Xharbour применительно к этому примеру ? 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
|
|
|
|
| постоянный участник
|
Пост N: 552
Зарегистрирован: 09.10.06
|
|
Отправлено: 21.10.08 19:36. Заголовок: Я уже писал - этот п..
Я уже писал - этот пример достаточно корректный. Единственное, я, наверное, делал бы проверку IsValidThread не перед JoinThread, а после StartThread.
|
|
|
|
| |
Пост N: 1026
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.10.08 08:15. Заголовок: Петр пишет: Единств..
Петр пишет: цитата: | Единственное, я, наверное, делал бы проверку IsValidThread не перед JoinThread, а после StartThread |
| Сделать , сделал только это мало что дало......... 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 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
|
|
|
|
| постоянный участник
|
Пост N: 554
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.10.08 09:58. Заголовок: Если внимательно чит..
Если внимательно читать описание 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?
|
|
|
|
| |
Пост N: 1027
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.10.08 12:31. Заголовок: Петр пишет: Так, чт..
Петр пишет: цитата: | Так, что ипользуя IsValidThread с JoinThread ты просто отсеиваешь глюки xHarbour |
| Хочешь сказать что тот же код без проверок (IsValidThread) будет работать в Harbour без падений ? ЗЫ rddads в Harbour адаптирован под старые версии ADS , типа 5-ой ?
|
|
|
|
| Администратор
|
Пост N: 1011
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.10.08 13:00. Заголовок: Dima пишет: rddads ..
Dima пишет: цитата: | rddads в Harbour адаптирован под старые версии ADS , типа 5-ой ? |
| Во всяком случае последнее изменение: + Added support for ADS_USE_OEM_TRANSLATION for old ads versions. в Harbour оперативно портировали
|
|
|
|
| постоянный участник
|
Пост N: 557
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.10.08 13:05. Заголовок: Dima пишет: Хочешь..
Dima пишет: цитата: | Хочешь сказать что тот же код без проверок (IsValidThread) будет работать в Harbour без падений ? |
| Я уже писал, что портирование даного примера из xHarbour в Harbour - далось мне с трудом, непонятные глюки на ровном месте. 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.
|
|
|
|
| |
Пост N: 1028
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.10.08 16:09. Заголовок: Петр пишет: Harbour..
Петр пишет: цитата: | 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 |
| Скачал и собрал 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 ***
|
|
|
|
|
| постоянный участник
|
Пост N: 561
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.10.08 17:01. Заголовок: Dima пишет: Скачал ..
Dima пишет: 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
|
|
|
|
| |
Пост N: 1035
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.08 08:50. Заголовок: Петр пишет: нужно в..
Петр пишет: цитата: | нужно в bld_b32.bat добавить set HB_MT=MT |
| получил тот же результат Dima пишет: цитата: | аргумент error hb_threadJoin |
|
|
|
|
|
| постоянный участник
|
Пост N: 563
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.10.08 12:35. Заголовок: Дима Ты слинковал п..
Дима Ты слинковал программу в ST режиме, отсюда и падения добавь таки set HB_MT=MT P.S. Для проверки в каком режиме работает HVM ST или MT используй hb_mtvm()
|
|
|
|
| |
Пост N: 1037
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.08 13:13. Заголовок: Петр пишет: добавь ..
Петр пишет: Грю же что добавил ;) Странно но в батнике 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 !!!
|
|
|
|
| |
Пост N: 1038
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.08 13:27. Заголовок: Петр Однако при 20 ..
Петр Однако при 20 запущенных потоках проц грузится очень конкретно. Пришлось в цикл воткнуть hb_idleSleep(0.001). Может есть какой то другой способ разгрузки процессора ?
|
|
|
|
| постоянный участник
|
Пост N: 564
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.10.08 13:42. Заголовок: О процессоре - охотн..
О процессоре - охотно верю. В реальной жизни, не в примере нужно вызывать hb_releaseCPU()
|
|
|
|
| |
Пост N: 1039
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.08 13:52. Заголовок: Петр Понял , спасиб..
Петр Понял , спасибо. Пересобрал и оставил крутится пару часов. Надеюсь не свалится :)
|
|
|
|
| |
Пост N: 1042
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.10.08 17:51. Заголовок: Петр пишет: Так, чт..
Петр пишет: цитата: | Так, что ипользуя IsValidThread с JoinThread |
| IsValidThread реализован в Harbour ? PS Как крыску отключить в Harbour ? Так не катит request HB_NOMOUSE
|
|
|
|
| постоянный участник
|
Пост N: 567
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.10.08 21:06. Заголовок: Dima пишет: IsValid..
Dima пишет: цитата: | IsValidThread реализован в Harbour |
| Нет, а зачем она тебе? Спрятать курсор? IMHO только WAPI ShowCursor() #pragma BEGINDUMP #include <windows.h> HB_FUNC( SHOWMOUSECURSOR ) { ShowCursor( hb_parl(1) ); } #pragma ENDDUMP
|
|
|
Ответов - 96
, стр:
1
2
3
4
5
All
[только новые]
|
|