Работа с файлами в MDI-окнах

Clarion, Clarion 7

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

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

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

Давно не брал я в руки Клару. Посему звиняйте за возможно ламерский вопрос. Он таков:

Программа работает с tps-файлом определённого формата, который открывается в MDI-окне. Поэтому в словаре описана только одна таблица. Файлы могут лежать в разных директориях. Поэтому в одном MDI-окне может быть открыт файл из одной директории, а в другом окне - файл из другой. Т.е. физически разные файлы одной структуры.

Разумеется, атрибут THREAD у таблицы в словаре есть.

Вопрос - как мне это всё корректно описать? В описании файла я для имени указываю переменную, но переменная может быть только глобальная, верно? А тут получается, что в разных окнах у неё должно быть разное значение.

Или я не о том думаю? Такое ощущение, что всё просто, но пары шариков не хватает. :-)

Это C6EE.
Написал: Капитан(67)
Гость

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

Глобальная переменная тоже может иметь атрибут THREAD и соответственно в каждом потоке разные значения ....
Гость

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

Здравствуйте уважаемый.

Атрибут thread в глобальной переменной лучше убрать.
По моему (ламерскому) пониманию содержимое переменной необходимо Вашей программе и системе только в момент открытия файла , потом ему присваивается какой-нибудь ID и переменную можно использовать повторно.

Vasiliev B <soft2@mail.redcom.ru>
Написал: ClaList(2)
Гость

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

Привет всем, кого заинтересовала эта тема ...

Действительно - можно и так, без thread. Только появляется
риск что при старте одновременно двух процессов возникнет
конфликт. К тому же если следовать рекомендациям SV - то
лучше вообще избегать глобальных переменных без thread.
Озвучено это было задним числом для C6.
К тому же только так можно получить в любой момент в потоке
значения имени файла, его месторасположение, выполнить
повторное переоткрытие и т.д.

С уважением, TATA.

P/S: А ламеры - они кто ... ? :)
Гость

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

До C6 такой проблемы нет. Переключение тредов производится только во время выполнения ACCEPT. В С6 такая проблема есть, но ничего специфического - это стандартная проблема конкурентного доступа к общим ресурсам. Нужно всего лишь использовать механизмы синхронизации процессов.
... лучше вообще избегать глобальных переменных без thread.
Озвучено это было задним числом для C6.
Это не задним числом. Это именно начиная с С6 и актуально. И "избегать" следует только если лень разбираться с существом вопроса. С ними тоже можно вполне нормально работать, только нужно соблюдать специальные правила.

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru

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

Nick, для меня это актуально! А мог бы подсказать как быть в 6-ке для
ситуаций когда File_Name:
1. Во всех процессах одинакова и появляется желание использовать ее без thread.
2. Может изменяться для отдельных процессов.

И что теперь для каждой нити я должен делать каждый раз активацию каждого File_Name? Напиши плиз что прочитать на эту тему попроще. У меня пока работает при File_Name без thread для случая 1. На пример можешь сослаться без АБС только, чтоб код был виден!

--
С уважением,
SAN mailto:vgsan@yandex.ru

F1 - Advanced Topics - Thread model documentation

Если кратенько, то

INCLUDE(‘CWSYNCHC.INC’),ONCE

FileNameVarLock CriticalSection

FileNameVarLock.Wait()
FileNameVar = ...
Open(File)
FileNameVarLock.Release()

2. Стало быть файл будешь переоткрывать. Тогда все то же самое.

И еще, если FileNameVar может изменяться по ходу дела, то _любую_ работу с
FileNameVar нужно брать в скобки FileNameVarLock.Wait() -
FileNameVarLock.Release()
И что теперь для каждой нити я должен делать каждый раз активацию каждого ...
Для каждого физического открываемого файла. Если все треды работают с одним файлом, то есно переменная инициализируется один раз до запуска тредов и голова больше не болит. Голова начинает болеть когда ты хочешь открывать в разных тредах разные файлы одной и той же структуры. Тогда ты должен перед открытием вписывать в переменную соответствующее имя файла. Вот тут и нужна синхронизация.

WBR, Nick Tsigouro
Написал: ClaList(2)
Гость

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

Действительно - можно и так, без thread. Только появляется риск что при старте одновременно двух процессов возникнет конфликт.
В версиях < 6.0 это не актуально, так как РЕАЛЬНОЕ переключение между псевдо-трейдами в младших версиях производилось менеджером потоков ТОЛЬКО в операторе ACCEPT.
К тому же если следовать рекомендациям SV - то лучше вообще избегать глобальных переменных без thread.
Озвучено это было задним числом для C6.
Как правильно подметил Николай - "не задним числом, а именно ТОЛЬКО для C6"! См. выше.
Ну а для C6 существуют, общепринятые в Виндах, механизмы блокировки общедоступных ресурсов. Они, кстати, так-же описаны в документе по измененной Thread-модели C6.
К тому же только так можно получить в любой момент в потоке значения имени файла, его месторасположение, выполнить повторное переоткрытие и т.д.
Не совсем. Переменная имени файла нужна ТОЛЬКО на этапе создания/открытия файла. После открытия файла значение этой переменной можно спокойно изменить, а текущее ПОЛНОЕ имя открытого файла можно получить через NAME(File) или File{PROP:Name}.

Так что, если речь идет о переменной имени файла БЕЗ аттрибута THREAD, то вполне можно обойтись кодом типа:

COMPILE('*C60*',_C60_)
MemLock CriticalSection
*C60*

COMPILE('*C60*',_C60_)
MemLock.Wait()
*C60*
GLO:FileName = 'DAT\0401\Members.tps'
Open(Members)
COMPILE('*C60*',_C60_)
MemLock.Release()
*C60*
...

А переоткрытие файла в ЛЮБОМ потоке:

COMPILE('*C60*',_C60_)
MemLock.Wait()
*C60*
GLO:FileName = Name(Members)
Close(Members)
Open(Members)
COMPILE('*C60*',_C60_)
MemLock.Release()
*C60*

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Гость

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

F1 - Advanced Topics - Thread model documentation
Если кратенько, то
INCLUDE(‘CWSYNCHC.INC’),ONCE
Нда, полезно перечитать. Но вот почему SaveErrorCode без THREAD
в примерах?
И кажется альтервнативы ООП нет если хотим устоичивости?

--
С уважением,
SAN
Написал: ClaList(2)
Ответить