Страница 3 из 3

Создать копию очереди

Добавлено: 31 Март 2016, 17:37
Yufil
kreator писал(а):
Дед Пахом писал(а):В том-то и фишка, что пока ты тупо копируешь, кто-то другой тупо её меняет.
Если меняет одна процедура, то она может выставить некий флаг на время изменения. Я как понял задачу? Некая одна процедура заполняет глобальную очередь периодически, скорее всего полностью обновляет. Другие процедуры пользуются этими данными, возможно всеми. Т.е. моя мысль - заменить эту глобальную очередь базой данных (тем же tps) ничего не даст. Нарвёмся на те же грабли, только быстрее, потому что работа с tps будет медленнее.
Не сработает, выше объяснял почему. Открой Help на слове CritialSection, там совсем просто,самый первый пример прямо о нашей задаче...

Создать копию очереди

Добавлено: 31 Март 2016, 19:34
dsabitov
Для NewUser.
Вот как можно манипулировать любой очередью. Может что-то пригодится в Вашей задаче....

Код: Выделить всё

  PROGRAM

OMIT('***')
 * Created with Clarion 10.0
 * Date: 31.03.2016
 * Time: 19:58
  ***

                    MAP
ManageAnyQ              PROCEDURE(QUEUE qName) ! queue always passed by address
                    END

SomeQueue           QUEUE ! очередь раз :)
ID                      LONG
Name                    STRING(50)
                    END

FQ                  QUEUE(FILE:Queue),PRE(mine) ! очередь 2 :)
                    END

    CODE
        SomeQueue.ID=1
        SomeQueue.Name='Lucy'
        ADD(SomeQueue)
        SomeQueue.ID=2
        SomeQueue.Name='James'
        ADD(SomeQueue)
        ManageAnyQ(SomeQueue) ! компромат на очередь 1
        
        DIRECTORY(FQ,'C:\*.*',ff_:DIRECTORY+ff_:NORMAL)
        ManageAnyQ(FQ) ! компромат на очередь 2
        
ManageAnyQ          PROCEDURE(QUEUE qName)
LocalQueue              &qName
field                   QUEUE
number                      LONG
name                        STRING(50)
                        END
QI                      STRING(512) ! информация о полях очереди - чтобы показать
    CODE
        ! если нужно, создать такую же локальную очередь
        LocalQueue &= NEW(qName)
        ! если нужно, скопировать данные в эту очередь
        rec#=RECORDS(qName)
        LOOP i#=1 TO rec# BY 1
            GET(qName,i#)
            LocalQueue :=: qName
            ADD(LocalQueue)
        END
        ADD(LocalQueue) ! теперь записей в локальной очереди больше, чем во входной 
        ! читаем поля
        fieldNumber#=0
        LOOP
            IF HOWMANY(qName,fieldNumber#+1)=0 THEN BREAK.
            fieldNumber#+=1
            field.number=fieldNumber#
            field.name=WHO(qName,fieldNumber#)
            ADD(field)
            QI = CLIP(LEFT(QI))&'('&field.number&') '&field.name&'|'
        END
        MESSAGE(RECORDS(qName)&' / '&RECORDS(LocalQueue) & '|' & CLIP(LEFT(QI)))
        DISPOSE(LocalQueue)

Создать копию очереди

Добавлено: 31 Март 2016, 19:50
NewUser
Спасибо всем откликнувшимся! Навыдавали вы, однако, три короба к размышлению. Я, конечно, подозревал, что могут быть проблемы при решении данной задачи, но всплывшие нюансы, разноликость виденья ситуации и способов ее решения вынуждают меня взять тайм-аут, в первую очередь, для осмысления изложенного. Но, это не значит, что не буду рад продолжению развития данной темы.