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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

kreator писал(а):
Дед Пахом писал(а):В том-то и фишка, что пока ты тупо копируешь, кто-то другой тупо её меняет.
Если меняет одна процедура, то она может выставить некий флаг на время изменения. Я как понял задачу? Некая одна процедура заполняет глобальную очередь периодически, скорее всего полностью обновляет. Другие процедуры пользуются этими данными, возможно всеми. Т.е. моя мысль - заменить эту глобальную очередь базой данных (тем же tps) ничего не даст. Нарвёмся на те же грабли, только быстрее, потому что работа с tps будет медленнее.
Не сработает, выше объяснял почему. Открой Help на слове CritialSection, там совсем просто,самый первый пример прямо о нашей задаче...
dsabitov
Посетитель
Сообщения: 44
Зарегистрирован: 02 Апрель 2011, 12:30

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

Сообщение 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)
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение NewUser »

Спасибо всем откликнувшимся! Навыдавали вы, однако, три короба к размышлению. Я, конечно, подозревал, что могут быть проблемы при решении данной задачи, но всплывшие нюансы, разноликость виденья ситуации и способов ее решения вынуждают меня взять тайм-аут, в первую очередь, для осмысления изложенного. Но, это не значит, что не буду рад продолжению развития данной темы.
Ответить