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




Пост 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: 488
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 19:08. Заголовок: HB_BackGroundActive(..


HB_BackGroundAdd() - добавляет новую фоновую задачу

Синтаксис:
HB_BackGroundAdd( <bAction>, [<nMillisecs>], [<lActive>] ) --> nTaskHandle

Аргументы:
<bAction>
Блок кода, который должен выполнятся в фоновом режиме.

<nMillisecs>
Необязательный числовой параметр, определяющий временной интервал в миллисекундах, после которого фоновая задача будет выполнена. Значение по умолчанию равно 0, а это значит, что фоновая задача вызывается каждый раз при проверке внутреннего списка задач фонового исполнения (имеется ввиду проверка внутренним обработчиком).

<lActive>
Значение по умолчанию для <lActive> равно .T. (ИСТИНА) приводит к тому, что <bAction> будет отмечен для немедленной фоновой деятельности. Передача же значения .F. (ЛОЖЬ) добавит задачу в внутренний список задач, но задача начнет выполняться после активирования ее посредством функции HB_BackGroundActive().

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

Описание:
Функция HB_BackGroundAdd() добавляет передаваемый ей в качестве аргумента блок кода в список фоновых задач которые будут выполнятся одновременно с главной программой. Ограничение на число фоновых задач не установлено.
Обработка фоновых задач должна быть включена командой SET BACKGROUND TASKS ON. Фоновые задачи обрабатываются секвенциально (последовательно) пока не будет SET BACKGROUND TASKS OFF или столкнемся с состоянием ожидания. Состояние ожидания есть такое состояние xHarbour virtual machine , в котором она (VM) ожидает пользовательский ввод с клавиатуры или события от мыши. VM входит в состояние ожидания при вызовах Inkey(). Все приложения, которые не использую вызовы функции Inkey() могут сигнализировать о состоянии ожидания посредством вызова функции HB_IdleState() (can signal the idle state with a call to the HB_IdleState() function) .
Примечение: для предотвращения прерывания фоновой обработки во время состояния ожидания задача ожидания должна быть определена как HB_IdleAdd( {||HB_BackGroundRun()} ).

Альтернатива фоновым задачам представлена потоками. Обратитесь к описанию функции StartThread() для одновременного выполнения частей приложения в различных потоках.



HB_BackGroundActive() - Запрашивает и/или изменяет активность одиночной фоновой задачи.

Синтаксис:
HB_BackGroundActive( <nTaskHandle> [, <lNewActive>] ) --> lOldActive

Параметры:
<nTaskHandle>
Дескриптор (числовой) фоновой задачи полученый в результате выполнения функции HB_BackGroundAdd().

<lNewActive>
Логическое значение (необязательный параметр) используемое для изменения активности фоновой задачи. Передавая .T. (ИСТИНА) можно активировать фоновую задачу и .F. (ЛОЖЬ) деактивировать ее.

Возвращаемое значение:
Функция возвращает предыдущее состояние (состояние до вызова функции) активности фоновой задачи, как логическое значение или NIL (см.ниже).

Описание:
Функция HB_BackGroundActive() опрашивает и изменяет (необязательно) состояние активности одиночной фоновой задачи. Если дескриптор задачи, возвращенный HB_BackGroundAdd() валидный (правильный), функция возвращает предыдущее состояние. Если передан неправильный дескриптор фоновой задачи, возвращаемое значение есть NIL.


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


Пост N: 489
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 19:11. Заголовок: А собственно какой п..


А собственно какой перевод нужен и зачем - такой вот подойдет ?

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




Пост N: 888
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.09.08 19:31. Заголовок: Петр пишет: А собст..


Петр пишет:

 цитата:
А собственно какой перевод нужен и зачем - такой вот подойдет ?


Да такой перевод подходит !!!
Есть одна задачка , которая должна обработать запросы с 20 станций одновременно и работать она должна
круглосуточно.
Можно остальной перевод ?
Хочу представлять как это работает , остальное сам докумекаю.
Спасибо !!!!!!!!!!!!!!!!!!

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


Пост N: 491
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 19:47. Заголовок: Dima пишет: Есть од..


Dima пишет:

 цитата:
Есть одна задачка , которая должна обработать запросы с 20 станций одновременно и работать она должна
круглосуточно.



Боюсь background здесь не пройдет, для решения такой задачи вам нужно

 цитата:
An alternative for background tasks is provided with threads. Refer to function StartThread() for running parts of an application simultaneously in multiple threads.


Альтернатива фоновым задачам представлена потоками. Обратитесь к описанию функции StartThread() для одновременного выполнения частей приложения в различных потоках.

Только вот незадача - MT в xHarbour реализован не полностью и не совсем корректно. Если религия позволяет ( ) посмотрите на Harbour.

Dima пишет:

 цитата:
Можно остальной перевод ?


Если действительно нужно - то сделаю сегодня. Хотя я к себе в роли переводчика отношусь мягко говоря с улыбкой

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




Пост N: 889
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.09.08 20:03. Заголовок: Петр Спасибо , ушел..


Петр
Спасибо , ушел думать ;) !

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


Пост N: 492
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 21:39. Заголовок: HB_BackGroundDel() -..


HB_BackGroundDel() - удаляет фоновую задачу из внутреннего списка задач.

Синтаксис:
HB_BackGroundDel( <nTaskHandle> ) --> bAction

Параметры:
<nTaskHandle>
Числовой дескриптор фоновой задачи, полученный в результате выполнения функции HB_BackGroundAdd().

Возвращаемое значение:
Функция возвращает блок кода связанный с дескриптором задачи ( т.е. блок кода переданный функции HB_BackGroundAdd()) или NIL если указан неверный дескриптор.

Описание
Функция HB_BackGroundDel() удаляет задачу связанную с переданным в качестве аргумента дескриптором, из внутреннего списка фоновых задач. Дескриптор фоновой задачи должен быть значением, которое возвращено предыдущим вызовом функции HB_BackGroundAdd(). Если указанная задача существует, она деактивируется и связанный с ней блок кода будет возвращен в качестве результата выполнения HB_BackGroundDel(). Как было указано выше, если указан неверный дескриптор - функция возвратит NIL.



HB_BackGroundReset() - сбрасывает внутренний счетчик фоновых задач.

Синтаксис:
HB_BackGroundReset() --> NIL

Возвращаемое значение:
Возвращаемое значениеs всегда равно NIL.

Описание
Функция HB_BackGroundReset() устанавливает значение внутреннего счетчика фоновых задач (определяющий следующую задачу, которая будет выполнятся) равным 1. Как результат, следующий цикл фоновой обработки стартует с задачи, которая была определена первой.



HB_BackGroundTime() получает или изменяет период ожидания (в миллисекундах) после истечения которого задача начинает выполнятся.

Синтаксис:
HB_BackGroundTime( ( <nTaskHandle> [, <nNewInterval>] ) --> nOldInterval

Параметры:
<nTaskHandle>
Числовой дескриптор фоновой задачи, полученный в результате выполнения функции HB_BackGroundAdd().

<nNewInterval>
Необязательный числовой параметр, определяющий временной интервал в миллисекундах, который фоновая задача должна выждать между двумя циклами выполнения. Если nNewInterval установлен в 0, фоновая задача вызывается каждый раз при проверке внутреннего списка задач фонового исполнения.

Возвращаемое значение:
Функция возвращает раннее установленный интервал ожидания фоновой задачи в виде числового значения (в миллисекундах) или NIL в случае если вы передали функции неверный дескриптор задачи

Описание:
Функция HB_BackGroundTime() запрашивает или изменяет число миллисекунд, после которых задача начинает выполнятся. Как правило, временной интервал определяется значением передаваемым в качестве второго аргумента функции HB_BackGroundAdd().



HB_BackGroundRun() - предписывает выполнение одной или всех фоновых задач.

Синтаксис:
HB_BackGroundRun( [<nTaskHandle>] ) --> NIL

Параметры:
<nTaskHandle>
Числовой дескриптор фоновой задачи, полученный в результате выполнения функции HB_BackGroundAdd(). Если опущен, все фоновые задачи будут выполнены.

Возвращаемое значение:
Возвращаемое значениеs всегда равно NIL.

Описание:
Функция HB_BackGroundRun() выполняет одиночную фоновую задачу определяемую <nTaskHandle> или все задачи из внутреннего списка задач, в случае если <nTaskHandle> если не определен (т.е. если функция вызывается без аргументов). Функция может быть использована для принудительного запуска фоновой задачи во время нормального выполнения программы или во время пребывания программы в состоянии ожидания.
Примечание: HB_BackGroundRun() выполняет задачу указанную <nTaskHandle> немедленно, даже если период ожидания, указанный для данной задачи не истек или фоновая задача находится в неактивном состоянии.

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


Пост N: 493
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 22:18. Заголовок: SET BACKGROUNDTICK -..


SET BACKGROUNDTICK - определяет интервал обработки для фоновых задач.

Синтаксис:
SET BACKGROUNDTICK <nInterval>

Аргументы:
<nInterval>
Числовое значение определяющее число инструкций обработанных виртуальной машиной xHarbour (VM) перед началом нового цикла обработки фоновой задачи. Значение по умолчанию равно 1000.

Описание:
SET BACKGROUNDTICK может быть использовано для "тюнинга" ( согласования, гармонии ) обработки фоновой задачи.
Значение по умолчанию 1000 обычно адекватно для хорошего баланса между нормальной и фоновой обработкой задач.
Фоновые задачи выполняются одновременно с главной программой. Если увеличивать <nInterval>, главная программа получит больше процессорного времени, вследствии чего меньше времени получит обработчик фоновых задач. Уменьшение <nInterval> улучшит время отклика для фоновых задач (но может ухудшить общую производительность программы - прим. переводчика ).



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


Пост N: 494
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 22:34. Заголовок: SET BACKGROUND TASKS..


SET BACKGROUND TASKS - разрешает или запрещает деятельность фоновых задач.

Синтаксис:
SET BACKGROUND TASKS on | OFF | (<lOnOff>)

Параметры:
on | OFF | (<lOnOff>)
Опции переключения активности фоновых функций, созданных HB_BackGroundAdd(). При ON или .T. (ИСТИНА), обработка фоновых задач доступна. OFF или .F. (ЛОЖЬ), установлено по умолчанию, запрещает обработку фоновых задач.

Описание:
SET BACKGROUND TASKS переключает (включает.выключает) активность обработки фоновых задач.
Фоновые задачи создаются функцией HB_BackGroundAdd() и выполняются одновременно с нормальными задачами программы.
Используйте HB_IdleAdd() для обработки паралельных (одновременных) задач только во время состояния ожидания.
Для доступности обработки фоновых задач SET BACKGROUND TASKS должен быть установлен в ON.


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


Пост N: 495
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.09.08 23:55. Заголовок: Во время перевода ок..


Во время перевода окончательно убедился, что функции

HB_IdleAdd() Добавляет фоновую задачу для началы выполнения во время состояния бездействия.
HB_IdleDel() Удаляет задачу с списка задач ожидания.
HB_IdleReset() Сбрасывает состояние счетчика задач ожидания.
HB_IdleSleep() Приостанавливает выполнение задач ожидания на n секунд.
HB_IdleSleepMSec() Запрашиват или изменяет интервал времени по умолчанию для обработки задач ожидания.
HB_IdleState() Указывает на состояние ожидания.
HB_IdleWaitNoCPU() Toggles the mode for CPU usage in Idle wait states.
вам не пригодятся.

Трудно представить задачу которая "должна обработать запросы с 20 станций одновременно и работать она должна
круглосуточно" и при этом еще должна ждать от пользователя ввод с клавиатуры или мыши.

Но если вдруг перевод таки понадобится, вам или кому нибудь другому, то смогу сделать толькозавтра вечером.

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




Пост N: 890
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.09.08 10:34. Заголовок: Петр Огромное спаси..


Петр
Огромное спасибо дружище !!!!!!!!!

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




Пост N: 684
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.09.08 18:34. Заголовок: Дима, ты бы хелпик с..


Дима, ты бы хелпик сделал для всех.... Для чего использовать, примеры там....
Всем было бы интересно...

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




Пост N: 893
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.09.08 18:45. Заголовок: Andrey Андрей ну пр..


Andrey
Андрей ну примеры то еcть однако , например
mtstress.prg
mttest.prg
У меня тут лежат выкачанные с CVS
C:\CVS\xharbour\tests\

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




Пост N: 970
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 08:09. Заголовок: Петр а если у меня ..


Петр
а если у меня задача находится все время в состоянии бездействия и просто сканирует определенные
папки и выполняет операции с файлами (без участия пользователя , типа "сервер") имеет ли значение что использовать HB_IdleAdd() или HB_BackGroundAdd() ?


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


Пост N: 517
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 10.10.08 12:59. Заголовок: Dima пишет: а если ..


Dima пишет:

 цитата:
а если у меня задача находится все время в состоянии бездействия и просто сканирует определенные
папки и выполняет операции с файлами



Т.е. inkey() не используется?

В этом случае нужно или пользоваться HB_IdleAdd()
или если использовать HB_BackGroundAdd, то примерно так

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


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




Пост N: 972
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 13:12. Заголовок: У меня примерно так ..


У меня примерно так
 
PROCEDURE Main
LOCAL nIdle,i,barray:=Array(3)
SET BACKGROUND TASKS ON
for i=1 to 3 // вроде пашет в 3 потока
barray := HB_IdleAdd({@TEST(),i})
next
do while inkey(0)#27
enddo

//функция Test и занимается работой с каталогами и базами
for i=1 to 3
HB_IdleDel( barray )
next
SET BACKGROUND TASKS OFF

RETURN


Есть какие то неточности или это полный бред ?

PS
Форум снова скушал скобки.......

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




Пост N: 973
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 13:33. Заголовок: Меня терзают смутные..


Меня терзают смутные сомнения.....
Предположим функция Test находится в процессе обработки базы данных и в этот момент
я жму Esc , завершится нормально текущий "Task" или нет ?

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


Пост N: 519
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 10.10.08 13:49. Заголовок: Dima пишет: заверши..


Dima пишет:

 цитата:
завершится нормально текущий "Task" или нет ?


В такой реализации скорее всего буду проблемы.

Теперь по поводу неточностей.
наверное правильнее будет

 цитата:
barray{i} := HB_IdleAdd(..
..
HB_IdleAdd(barray{i})



и зачем
SET BACKGROUND TASKS ON
SET BACKGROUND TASKS OFF
если HB_BackgroundAdd не используется..



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




Пост N: 974
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 15:11. Заголовок: С удивлением обнаруж..


С удивлением обнаружил что HB_idledel всегда возвращает NIL
Например Idletest.prg из \Tests

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


Пост N: 520
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 10.10.08 18:17. Заголовок: Dima пишет: HB_idle..


Dima пишет:

 цитата:
HB_idledel всегда возвращает NIL



в Harbour все правильно
? hb_IsBlock(hb_IdleDel(id)) - > .T.

Все равно - в твоем случае я бы с MT эксперементировал.


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




Пост N: 976
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 18:24. Заголовок: Петр пишет: Все рав..


Петр пишет:

 цитата:
Все равно - в твоем случае я бы с MT эксперементировал


я бы рад , но не могу ADS приручить для этого режима. бьет ошибку
подробности тут http://clipper.borda.ru/?1-4-0-00000362-000-30-0-1223645823

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


Пост N: 521
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 10.10.08 18:38. Заголовок: Извини, нет у меня A..


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

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




Пост N: 977
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.10.08 18:48. Заголовок: Петр http://files.m..

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


Пост 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 немного поправить, алиасы указать..


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




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


А вот так действительно собралось ;)
Спасибо !!!

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




Пост 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 режима ?


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


Пост 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.
Можно это сделать и по другому, но это самый простой путь, к тому же правильный.


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




Пост N: 982
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.10.08 14:56. Заголовок: Петр Спасибо , все ..


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

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




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


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


Пост 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 или не будет.



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




Пост N: 984
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.10.08 19:25. Заголовок: Петр Буду думать , ..


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

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


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


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


Пост 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)) и поиграться

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




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


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


Пост 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() ) убивать потоки не рекомендую вообще, за исключением действий при форсмажорных обстоятельствах.





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




Пост 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 режиме , в обычном все нормально)


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




Пост N: 987
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.10.08 13:06. Заголовок: Виноват , поправка З..


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

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




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

В обычном режиме все нормально.......

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




Пост N: 990
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.10.08 16:36. Заголовок: Вообщем решил пока н..


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

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




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



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


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


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




Пост 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 
ПрофильЦитата Ответить
администратор




Пост N: 1023
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.10.08 16:00. Заголовок: Петр пишет: вызов T..


Петр пишет:

 цитата:
вызов ThreadSleep(nTimeOut) с nTimeOut < 20 не желателен, хотя и возможен.


Не знал , учту. Спасибо !!!

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




Пост 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 не был выполнен
, к каким последствиям это может привести ?

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


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


Dima пишет:

 цитата:
О чем говорит факт что IsValidThread вернет .F. , о том что данный поток закончен
и нет смысла делать для него JoinThread ?


Нет, IsValidThread вернет .F. также в том случае по какой-то причине поток не инициализировался.

Dima пишет:

 цитата:
к каким последствиям это может привести


Все зависит от задачи, порой к плачевным
Выполнять JoinThread не обязательно, но ты, наверное, хотел бы контролировать поведение своей программы.

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




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


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


Пост N: 552
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 21.10.08 19:36. Заголовок: Я уже писал - этот п..


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

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




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


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


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


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




Пост N: 1027
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.10.08 12:31. Заголовок: Петр пишет: Так, чт..


Петр пишет:

 цитата:
Так, что ипользуя IsValidThread с JoinThread ты просто отсеиваешь глюки xHarbour


Хочешь сказать что тот же код без проверок (IsValidThread) будет работать в Harbour без падений ?


ЗЫ
rddads в Harbour адаптирован под старые версии ADS , типа 5-ой ?

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




Пост 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 оперативно портировали

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


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



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




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




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


Пост N: 561
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 22.10.08 17:01. Заголовок: Dima пишет: Скачал ..


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


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




Пост N: 1035
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.08 08:50. Заголовок: Петр пишет: нужно в..


Петр пишет:

 цитата:
нужно в bld_b32.bat
добавить
set HB_MT=MT


получил тот же результат
Dima пишет:

 цитата:
аргумент error
hb_threadJoin



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


Пост N: 563
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.10.08 12:35. Заголовок: Дима Ты слинковал п..


Дима

Ты слинковал программу в ST режиме, отсюда и падения

добавь таки set HB_MT=MT


P.S. Для проверки в каком режиме работает HVM ST или MT используй hb_mtvm()

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




Пост N: 1037
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.08 13:13. Заголовок: Петр пишет: добавь ..


Петр пишет:

 цитата:
добавь таки 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 !!!


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




Пост N: 1038
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.08 13:27. Заголовок: Петр Однако при 20 ..


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

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


Пост N: 564
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.10.08 13:42. Заголовок: О процессоре - охотн..


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


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




Пост N: 1039
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.08 13:52. Заголовок: Петр Понял , спасиб..


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

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




Пост N: 1042
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.10.08 17:51. Заголовок: Петр пишет: Так, чт..


Петр пишет:

 цитата:
Так, что ипользуя IsValidThread с JoinThread


IsValidThread реализован в Harbour ?

PS
Как крыску отключить в Harbour ?
Так не катит request HB_NOMOUSE

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


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


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




Пост N: 1043
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.10.08 06:21. Заголовок: Петр пишет: Спрятат..


Петр пишет:

 цитата:
Спрятать курсор? IMHO только WAPI ShowCursor()


Спасибо , но не сработало.

Петр пишет:

 цитата:
Dima пишет:

цитата:
IsValidThread реализован в Harbour

Нет, а зачем она тебе?



Просто хотел подстраховаться от возможного вылета в hb_threadJoin(),
так как задача будет работать 24 часа в сутки.



И еще вопрос.
 
for i=1 to 20
hb_threadStart(@Test(),i)
next


Каждый поток обрабатывается в своей области памяти ?
Не будет конфликта локальных и привате переменных объявленных в функции Test() ?

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


Пост N: 568
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.10.08 07:44. Заголовок: ShowCursor( .F. ) ка..


ShowCursor( .F. ) катит? Странно..

Проверяй thread на hb_isPointer(thread) != .F.

Dima пишет:

 цитата:
Каждый поток обрабатывается в своей области памяти ?


Смотри tests\mt\mttest08.prg
Локальных не будет, а там как напишешь , т.е. с какими параметрами вызовешь hb_threadStart.
Статические переменные обьявляй как thread static (если нужно)


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




Пост N: 1049
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.10.08 12:26. Заголовок: Петр Подскажи дружи..


Петр
Подскажи дружище что тут можно сделать !
 
for nind=1 to 50
hb_threadStart(@Test(),nind)
next

Func Test(nid)
USE test SHARED Alias &( "Test"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test1"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test2"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test3"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test4"+ Alltrim( Str(nId)) ) NEW

* тут что то делаем
* и в какой то момент можем получить такой то Alias не существует
* при обращении к какой то базе.
* Почему ?
* Куда и какой костыль вставить ? :)

close ("Test"+ Alltrim( Str(nId)))
close ("Test1"+ Alltrim( Str(nId)))
close ("Test2"+ Alltrim( Str(nId)))
close ("Test3"+ Alltrim( Str(nId)))
close ("Test4"+ Alltrim( Str(nId)))

return nil


PS
ADS.
Что интерестно , то работает то нет..........

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




Пост N: 1051
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.10.08 14:06. Заголовок: Если вставить костыл..


Если вставить костыль , то работает , но это наверное не выход
 
for nind=1 to 50
hb_threadStart(@Test(),nind)
hb_idleSleep(5)
next


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


Пост N: 571
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.10.08 18:13. Заголовок: Dima пишет: for ni..


Dima пишет:

 цитата:
for nind=1 to 50
hb_threadStart(@Test(),nind)
next



Это реальная ситуация? Тебе действительно нужно вызывать 50 потоков?
И зачем одну базу открывать столько раз. По коду я вижу, что ты даже не проверяешь, успешно ли открыта база.


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




Пост N: 1052
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.10.08 18:29. Заголовок: Петр пишет: Это реа..


Петр пишет:

 цитата:
Это реальная ситуация? Тебе действительно нужно вызывать 50 потоков?


Ситуация почти реальна. Сколько зайдет запросов столько будет и потоков.
Запросов может быть от 1 до 50
Открытие базы я конечно же проверяю , дал пример что бы ясно было чего делаю.
Если хоть одна база не открыта я выхожу из функции Test.
Возможно дело в кол-ве одновременно открываемых файлов ? Тогда что нужно исправить ?
Реально в одном потоке я открываю 20 баз и 15 индексных файлов.

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


Пост N: 572
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.10.08 18:56. Заголовок: А упростить себе жиз..


А упростить себе жизнь и держать таблицы открытыми?


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




Пост N: 1053
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.10.08 18:59. Заголовок: Петр пишет: А упрос..


Петр пишет:

 цитата:
А упростить себе жизнь и держать таблицы открытыми?


Не думал про это , теперь подумаю !
И все же почему падает пример ?

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


Пост N: 573
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.10.08 19:28. Заголовок: Хороший вопрос, но у..


Хороший вопрос, но у меня сейчас нет на него ответа.
Надо тестировать. Хотя бы найти, чей это косяк ADS или Harbour.
Посмотрю на досуге.

Но ясно одно, такие программы должны быть тщательно спроектированы и реализованы.

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




Пост N: 1054
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.10.08 10:32. Заголовок: В реальном примере п..


В реальном примере падает даже на 3 потоках (не всегда) с той же ошибкой "Alias не существует"
При чем падает в разных местах и закономерности не обнаружил.
Базы все открыты 100 % (по той схеме о которой писал выше)
Есть причины не держать базы все время открытыми.
Где то читал на форуме http://www.fivetechsoft.com/forums что ADS не работает в MT режиме или
работает не корректно.....но пока не вижу ссылки на тему.

PS
В отличие от Xharbour , Ads спецом для MT режима я не пересобирал , все собралось и так.
Возможно в этом причина ?

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




Пост N: 1055
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.10.08 13:16. Заголовок: Dima пишет: Func ..


Dima пишет:

 цитата:

 
Func Test(nid)
USE test SHARED Alias &( "Test"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test1"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test2"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test3"+ Alltrim( Str(nId)) ) NEW
USE test SHARED Alias &( "Test4"+ Alltrim( Str(nId)) ) NEW

* тут что то делаем
* и в какой то момент можем получить такой то Alias не существует
* при обращении к какой то базе.
* Почему ?
* Куда и какой костыль вставить ? :)

close ("Test"+ Alltrim( Str(nId)))
close ("Test1"+ Alltrim( Str(nId)))
close ("Test2"+ Alltrim( Str(nId)))
close ("Test3"+ Alltrim( Str(nId)))
close ("Test4"+ Alltrim( Str(nId)))

return nil



Опытным путем установил , что если nid локальная переменная то прога может падать. Если Private
то не падает.
Если так может упасть
Func Test(nid)
Так пока не упала ни разу ;)
Func Test()
param nid

PS
Рано радовался...............меньше стало падать но все равно падает


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


Пост N: 574
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.10.08 14:18. Заголовок: Dima пишет: В отлич..


Dima пишет:

 цитата:
В отличие от Xharbour , Ads спецом для MT режима я не пересобирал , все собралось и так.
Возможно в этом причина ?



Скорее всего нет, я склоняюсь к мысли, что это проблемы ADS - не успевает отрабатывать запросы.

for nind=1 to 50
hb_threadStart(@Test(),nind)
next
с RDDCDX отрабатывает без проблем

Меняй схему работы - запросы ставь в очередь и обрабатывай последовательно.
И hb_idleSleep() - это не костыль.

А вообще задача у тебя на каком процессоре крутится - есть реальная многопроцессорность (ядерность) или все средствами OS разруливается?


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




Пост N: 1056
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.10.08 14:53. Заголовок: Петр пишет: Меняй с..


Петр пишет:

 цитата:
Меняй схему работы - запросы ставь в очередь и обрабатывай последовательно


Видимо так и придется делать , хотя задачу ставили что бы все крутилось одновременно.
Есть около 50 коммерческих агентов которые ездят с ноутбуками и собирают заявки от своих
клиентов. По мере необходимости каждый из агентов сбрасывает на ftp свои заявки + могут
делать запросы на получение прайс листов , остатков , актуального справочника своих клиентов
и тд и тп. Именно эти запросы и хотелось пустить в потоки..........но , похоже не выйдет
так как ADS выбрыкивается.
Жаль.

Задача крутится на самом обычном процессоре под XP


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


Пост N: 575
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.10.08 15:53. Заголовок: Dima пишет: Задача ..


Dima пишет:

 цитата:
Задача крутится на самом обычном процессоре под XP



Почитай в справке ADS - Number of Worker Threads.
Для 50 рабочих потоков нужно, как минимум 4 CPU (физических или логических).


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




Пост N: 1057
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.10.08 16:16. Заголовок: Петр Понял. Спасибо..


Петр
Понял. Спасибо !

Буду обрабатывать запросы последовательно.

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




Пост N: 1058
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.10.08 10:06. Заголовок: Глянул Ads_err.dbf ,..


Глянул Ads_err.dbf , когда прога падала лезут одни и те же ошибки
 
THREAD_NUM ERR_CLASS ERR_CODE ADS_SOURCE SRC_LINE
111295936 0 16 dbf.c 269
111295936 0 128 dbf.c 270
111295936 7000 7040 dbf.c 280
111879232 0 16 dbf.c 269
111879232 0 128 dbf.c 270
111879232 7000 7040 dbf.c 280


Так и не понял что за ERR_CODE 128 , в доке не нашел.

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

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