On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
администратор




Пост 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.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 96 , стр: 1 2 3 4 5 All [только новые]


администратор




Пост N: 996
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.10.08 13:17. Заголовок: Петр Спасибо !!!..


Петр
Спасибо !!!

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 999
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 11:09. Заголовок: Петр В чем разница ..


Петр
В чем разница ? Похоже и в том и другом случае все завершается коректно.
 
PROCEDURE main
LOCAL threadA, threadB

threadB := StartThread( @MyFuncB())
threadA := StartThread( @MyFuncA() )


JoinThread( threadA )
JoinThread( threadB )

RETURN

*********************************
 
PROCEDURE main
LOCAL threadA, threadB

threadB := StartThread( @MyFuncB())
threadA := StartThread( @MyFuncA() )


WaitForThreads()
RETURN


И еще вопросы.
Можно ли в функции MyFuncB() , стартовать еще потоки на выполнение (StartThread) ?
Для чего нужна функция HB_MutexCreate() ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1000
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 13:38. Заголовок: Петр Будет ли верно..


Петр
Будет ли верно работать такой код или нужно что то поправить ?
 
STATIC lExit
Global Puts
Global cserv
PROCEDURE main
LOCAL threadA, threadB
lExit := .F.
puts:="C:\TEST"
cserv:="\\servak\sys\sklad"
threadB := StartThread( @MyFuncB())
threadA := StartThread( @MyFuncA())


JoinThread( threadA )
JoinThread( threadB )
RETURN
*************************
func MyFuncB()
local adir
LOCAL aFile
local aExtract
local nind:=0

DO WHILE !lExit
adir:=Directory(puts+"A*.zip")
if len(adir)>0
FOR EACH aFile IN aDir
aExtract := hb_GetFilesInZip( puts+afile[1])
IF HB_UNZIPFILE( puts+afile[1],,,,cserv,aExtract)
nind:=val(substr(afile[1],2,at("_",afile[1])-1))
StartThread(Test(nind) // открываем одни и те же базы с разными Alias
WaitForThreads() // в зависимости от nind
ferase(puts+afile[1])==0
ENDIF
next
endif
ThreadSleep(100)
enddo
RETURN nil
******************
PROCEDURE MyFuncA( )
DO WHILE inkey( 0.1 ) != 27
ENDDO
lExit := .T.
RETURN



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 530
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 15:44. Заголовок: Dima пишет: В чем р..


Dima пишет:

 цитата:
В чем разница ? Похоже и в том и другом случае все завершается коректно



В таком контексте - да.
Но нужно учесть, что функция WaitForThreads ( в Harbour hb_threadWaitForAll ) приостанавливает выполнение главного потока, дожидаясь пока не завершат свою роботу все остальные потоки. В случае, если до вызова WaitForThreads все вторичные потоки уже завершили свою роботу, функция просто немедленно завершит свое выполнение.
Главный поток создается неявно и в главном потоке выполняется функция Main (_AppMain).
Использование функции WaitForThreads в вторичных потоках (отличных от главного) не имеет смысла, так как функция просто немедленно возвратит управление вызывающему потоку ничего не делая.
Иными словами использовать WaitForThreads можно только в функции Main (_AppMain).

Функцию же JoinThread() можно вызывать как из главного, так и из вторичных потоков.
Функция JoinThread() ( в Harbour hb_threadJoin ) приостанавливает выполнение того потока, из которого она была вызвана, дожидаясь пока не завершит свою роботу поток, указатель на который был передан функции в виде аргумента. В случае, если до вызова JoinThread( thread) поток thread уже завершил свою роботу, функция просто немедленно завершит свое выполнение.


 цитата:
Будет ли верно работать такой код или нужно что-то поправить ?


Нужно править. См. выше.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 531
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 15:54. Заголовок: Dima пишет: Можно л..


Dima пишет:

 цитата:
Можно ли в функции MyFuncB() , стартовать еще потоки на выполнение (StartThread) ?
Для чего нужна функция HB_MutexCreate() ?



1) Можно, только, ну ты сам понимаешь
2) Для разрешения возможных коллизий при одновременном доступе к ресурсам ( например, к переменным ) из разных потоков.
Механизм чем-то похожий на блокировки записей, таблиц.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 533
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 19:23. Заголовок: Dima пишет: ? AdsIs..


Dima пишет:

 цитата:
? AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\"+"data_nul.dbf") // локальный ADS , возвращает 0
Причем до вызова всех StartThread , AdsIsServerLoaded работает правильно



Не могу подтвердить, AdsIsServerLoaded( cPath ) при доступном (существующем) cPath для локального ADS возвращает 1, как и положено.

P.S. Имя файла ( AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\"+"data_nul.dbf") ) задавать не нужно, все равно оно при проверке отбрасывается.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1001
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 19:41. Заголовок: Петр пишет: Не могу..


Петр пишет:

 цитата:
Не могу подтвердить, AdsIsServerLoaded( cPath ) при доступном (существующем) cPath для локального ADS возвращает 1, как и положено.


В фунции запущенной через StartThread ?
Грю же что проверил , не пашет.
До StartThread вернет 1
В функции запущенной в поток вернет 0

ЗЫ
Путь cPath одинаков и он существует !
Что касается имени файла , спасибо , поправлю !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1002
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 19:48. Заголовок: Пример конечно грубы..


Пример конечно грубый , но понятно где не пашет.
Юзаем AdsSetServerType(3) // Local + Remote Ads
........
? AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\") // ==1
threadB:=StartThread(@Test())

В функции Test
? AdsIsServerLoaded(CurDrive()+":\"+CurDir()+"\DBF\") // ==0 всегда в режиме MT (Xharbour)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 535
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 20:15. Заголовок: Я тестировал на этом..


Я тестировал на этом -
? res := AdsIsServerLoaded( CurDrive()+":\"+CurDir() ) == 1

STATIC lExit 
//
PROCEDURE main
LOCAL threadA, threadB, threadC

lExit := .F.

threadC := StartThread( @TestAds() )
threadB := StartThread( @MyFuncB() )
threadA := StartThread( @MyFuncA() )

WaitForThreads()
//
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 2
nCounter ++
NEXT nI
ThreadSleep(20)
END
//
RETURN nCounter

/*
*/
FUNCTION TestAds( cDBF )
LOCAL cField, res

IF cDbf == NIL
cDbf := "test"
ENDIF

RddSetDefault( "ADSCDX" )
AdsSetServerType( 1 )
AdsSetFileType( 2 )

? res := AdsIsServerLoaded( CurDrive()+":\"+CurDir() )

IF File( "adstest.dbf" )
FErase( "adstest.dbf" )
ENDIF

USE (cDBF) ALIAS "MY" EXCLUSIVE
IF ! File( "adstest.dbf" )
COPY STRUCTURE TO adstest
ENDIF

USE adstest ALIAS "MY2"
DO WHILE RecCount() < 1000
? "Copying..."
APPEND ALL FROM test
ENDDO

cField := Lower( FieldName(1) )

INDEX ON &cField TO (cField)

ThreadSleep(20)
//
RETURN res


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1003
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 20:24. Заголовок: Петр пишет: Я тести..


Петр пишет:

 цитата:
Я тестировал на этом -


Xharbour ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1004
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 20:29. Заголовок: Петр пишет: RddSetD..


Петр пишет:

 цитата:
RddSetDefault( "ADSCDX" )
AdsSetServerType( 1 )
AdsSetFileType( 2 )


По ходу эти вещи я объявил в основной процедуре (Main) , может в этом дело.............

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 536
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 20:35. Заголовок: Dima пишет: По ходу..


Dima пишет:

 цитата:
По ходу эти вещи я объявил в основной процедуре (Main) , может в этом дело.............



Очень даже может быть
Если так то 0 и ADSCDX/5033 Open error: test.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 537
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 20:36. Заголовок: Dima пишет: Xharbou..


Dima пишет:

 цитата:
Xharbour ?

- угу

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 538
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.10.08 20:40. Заголовок: в Harbour - все Ok и..


в Harbour - все Ok и так и так.
И вообще в Harbour MT (и не только MT) на порядок лучше.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1005
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.10.08 20:54. Заголовок: Петр пишет: И вообщ..


Петр пишет:

 цитата:
И вообще в Harbour MT (и не только MT) на порядок лучше.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1019
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.10.08 14:51. Заголовок: Петр Вроде чуть про..


Петр
Вроде чуть продвинулся. В примере ниже из потока threadB , запускаю 20
потоков и все корректно завершается на первый взгляд и без падений.
Можешь прокоментировать или что то добавить ?
 
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



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1020
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.10.08 15:28. Заголовок: Чуть усложняем функц..


Чуть усложняем функцию MyFuncB ....полет нормальный однако

 
func MyFuncB()
local nind
local tst
local anind

DO WHILE !lExit
tst:=HB_RandomInt(1,20)
anind:=array(tst)
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
RETURN nil



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 549
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.10.08 11:18. Заголовок: Dima пишет: В приме..


Dima пишет:

 цитата:
В примере ниже из потока threadB , запускаю 20
потоков и все корректно завершается на первый взгляд и без падений.




Ну падений не должно быть, ты же используешь IsValidThread.
Все довольно корректно написано.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1022
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.10.08 15:19. Заголовок: И снова небольшая мо..


И снова небольшая модификация
 
func MyFuncB()
local nind
local tst
local anind

DO WHILE !lExit
tst:=HB_RandomInt(1,20)
anind:=array(tst)
for nind=1 to tst
anind[nind]:=StartThread(@Test(),nind)
ThreadSleep(20) // иначе IsValidThread не всегда вернет .T.
next

for nind=1 to len(anind)
if IsValidThread(anind[nind])
JoinThread(anind[nind])
endif
next
enddo
RETURN nil


 
Func Test(nrow)
local i
for i=1 to 1000
DispOutAt(nRow,10,str(i,5))
ThreadSleep(1) // что бы проц не грузило :)
next
return nil



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 550
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.10.08 15:39. Заголовок: Dima пишет: ThreadS..


Dima пишет:

 цитата:
ThreadSleep(20) // иначе IsValidThread не всегда вернет .T.



Да - в Harbour ThreadSleep не нужен, да и нет его ,
в xHarbour ThreadSleep сводится к банальному sleep.

Поскольку Windows никогда не была системой реального времени, вызов ThreadSleep(nTimeOut) с nTimeOut < 20 не желателен, хотя и возможен.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 96 , стр: 1 2 3 4 5 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет