Передача ссылки на очередь в другой поток

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Добрейший день.

Как можно передать в другой поток (запускаемый через START) ссылку на локальную очередь? Что-то вроде:

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

MyQueue QUEUE,TYPE

 …….

  END

 

Func1 PROCEDURE()

Func1LocalQueue MyQueue

StrQueueRef STRING(20)

 

  CODE

  StrQueueRef = GetQueueReference(Func1LocalQueue)

  START(Func2, , StrQueueRef)
 

Func2 PROCEDURE(STRING StrQueueRef)

Func2RefQueue &MyQueue

  CODE

  SetQueueReference(Func2RefQueue, StrQueueRef)
Можно ли сделать что-то подобное или проще передавать ссылку через глобальную переменную?

Павел Яковенко

(Добавление)

Примерно так, про открытия окон я упустил, думаю понятно

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

  map
   Proc1
   Proc2(string)
  end
 
Proc1        procedure
loc_Queue    Queue
Fiedl1            string(20)
 end
    code
 
 START(Proc2,25000,(ADDRESS(loc_Queue)))
 
Proc2        procedure(string Handle)
loc_Queue &Queue
    CODE
 
  loc_Queue &= (Handle)


Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
Yahoo group: clarion@yahoogroups.com

Компилятор такой код пропускает, но получаем стабильный GPF при работе с очередью в процедуре Proc2

Проверял в C5 и С55 (все патчи последние)

Павел Яковенко

(Добавление)

Для очереди не делал, но для класса см. мой пример Loader у Евгения
Стефаненко,далее по аналогии:

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

MAP
  UserProc PROCEDURE(STRING Param)
END

MyQueue QUEUE,TYPE
  ...
  END

TrGroup
RefMyQue &MyQueue
END

 CODE

  ...

  START(UserProc,,TrGroup)


!----------------------------------------------------
!  Процедура пользователя
!----------------------------------------------------
UserProc PROCEDURE(STRING Param)

L:TrGroup
RefMyQue &MyQueue
 END

  CODE
    L:TrGroup = Param
--
Best regards,
Селин_К.Е. mailto:kada@adm.kaluga.ru

(Добавление)

Прикольно, действительно работает.
Спасибо.

Павел Яковенко
Написал: ClaList(2)
Гость

Сообщение Гость »

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

!----------------------------------------------------
!  Процедура пользователя
!----------------------------------------------------
UserProc PROCEDURE(STRING Param)
 
L:TrGroup,OVER(Param)
RefMyQue &MyQueue
 END

В аттаче работающий пример, думаю многим будет интересно.

Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
Yahoo group: clarion@yahoogroups.com

(Добавление)
Я поглядел в диспечер задач, библиотека выгружается
Честно говоря в диспетчере я даже не увидел загрузки библиотеки -
только изменение объема памяти. Но не в этом дело.
Действительно - приведенный мою вариант не выгружает - сужу по коду
возврата. Т.е. если использование в данном случае эквивалентно
отсутствию этого кода вообще ;-)
Писал прототип по памяти (под рукой ничего похожего не было) - вот и
ошибся.

Но твой вариант вызывает GPF. Практическая ценность в данном случае
его не выше моего - не так ли?

Кстати - невыгрузка библиотки ни к чему страшному не приведет
почти никогда - загрузиться-то dll только в первый раз - и при
завершении задачи выгрузиться.

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

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757

(Добавление)

Дело в другом, это на тему:

memcpy(*?,*?),raw,name('_memcpy')

и спрашивают, почему падает при использовании, пример прилагают.
здесь сразу без примера видно в чём дело в первую очередь, и ответ будет без
прсмотра соответственный:

memcpy(*?,*?,UNSIGNED),LONG,RAW,NAME('_memcpy')

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

Но я утверждаю, прототипы используемых функций должны быть описаны
правильно, о чём и писал.

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

Andrew Myalin
Написал: ClaList(2)
Гость

Сообщение Гость »

Примерно так, про открытия окон я упустил, думаю понятно

 START(Proc2,25000,(ADDRESS(loc_Queue)))
Увы, Андрей! Так будет передан ТОЛЬКО адрес
буфера записи данной очереди. О чем, кстати (наконец!),
сказано в доке по C60.
Для передачи именно адреса очереди следует воспользоваться
группой-оберткой на реферал данной очереди. И передавать
уже содержимое этой группы в виде строки.

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

RefGrp GROUP
QueRef   &MyQueue
       END

  ...
  QueRef &= MyQueue
  START(Proc2,25000,RefGrp)
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com

Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Ответить