Delphi + Clarion DLL

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Добрый день спецы!
Необходима помощь.
Написана dll на кларе 5.5 (шаблонном)
В функцию передаем F_ID (LONG), получаем результат обработки Loc:Ret (LONG)
Loc:Ret = -1
Open(Table_Data, 0h)
If ~ErrorCode()
Clear(TD:Record)
TD:ID = F_ID
Get(Table_Data, TD:Key1)
If ~ErrorCode() Then
!... тут обработчик
.
Close(Table_Data)
Else Send_Log(ErrorCode() & ' ' & FILEERRORCODE() & ' ' & Clip(Left(ErrorFile())) & ' ' & Clip(Left(Error())))
.
Return(Loc:Ret)

На дельфях:
Запускается поток и в потоке вызываем функцию из DLL
Периодически возникает ошибка открытия файла
36 f:\DATA\Table_Data.dat Invalid Data File
Причем раз на раз не приходится, иногда без ошибки отрабатывает, иногда с ошибкой с одним и тем же F_ID.
Файлик Table_Data.dat находится на расшаренном ресурсе и юзают его очень многие.


И еще вопросик:
Клара может работать с потоками?
Из основного окна запустить с десяток потоков, которые должны работать одновременно и не тормозить поток основного окна.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Delphi + Clarion DLL

Сообщение Дед Пахом »

Насчёт потоков - да, конечно, смотри START.
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Дед Пахом писал(а): Насчёт потоков - да, конечно, смотри START.
Имеете ввиду
Start(proc1)
Start(proc2)
Start(proc3)
proc1-proc3 - бесконечный цикл
И основное окно не будет тормозить?
Это ABC или шаблонный кларион?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Delphi + Clarion DLL

Сообщение Дед Пахом »

Dark_Stranger писал(а): И основное окно не будет тормозить?Это ABC или шаблонный кларион?
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Дед Пахом писал(а):
Dark_Stranger писал(а): И основное окно не будет тормозить?Это ABC или шаблонный кларион?
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
насколько я знаю 5.5 не умеет работать в реальном многопоточном режиме, активным поток может быть только один
START(MDI_FORM1)
START(MDI_FORM2)
Запускаем две формы, но активный поток (активная форма) может быть только один.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Delphi + Clarion DLL

Сообщение Дед Пахом »

Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Дед Пахом писал(а): Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
А в 6 таких проблем нет?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Delphi + Clarion DLL

Сообщение Дед Пахом »

Да вроде нет.
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Дед Пахом писал(а): Да вроде нет.
Проверил на 6, работает!

Остается решить вопрос с управлением потоком и его приоритетом.
8 - одновременно запущенных потоков грузят i-7 4770K на 100% - ЭТО ППЦ

Приостановить поток на время.
Возобновить поток.
Изменить приоритет потока.
Передать в поток некие параметры.
Есть какая нить инфа?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Delphi + Clarion DLL

Сообщение Дед Пахом »

смотри SUSPEND, RESUME, NOTIFY
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Дед Пахом писал(а): смотри SUSPEND, RESUME, NOTIFY
СПС большое.
Остается разобраться как поставить приоритет потока.
Дельфийские параметры потока:
tpIdle
tpLowest
tpLower
tpNormal
tpHigher
tpHighest
tpTimeCritical

А аналоги в кларе?
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

Delphi + Clarion DLL

Сообщение Dark_Stranger »

Провел испытания:
Код ошибка - 36; Файл - f:\DATA\Table_Data.dat; Месага - Invalid Data File
Если запускать DLL с интервалом каждую секунду вероятность возникновения ошибки большая (Процентов - 90%).
Если запускать DLL с интервалом каждые 10 секунд вероятность возникновения ошибки снижается существенно (Процентов - 1-2%).

Есть соображения на этот счет?
Такое ощущение, что как будто предыдущее закрытие файла не завершилось и попытка нового открытия файла приводит к ошибке.




Есть у кого опыт работы с FileManager?
Если используя FileManager открывать файлы и в определенный момент отвалится сетевой диск приведет ли это к ошибке с выводом сообщения "Файл не найден....Нажмите ОК для завершения этой программы", "HALT", или же при нарушении в ключе
"Ошибка KEY... при попытке доступа к файлу ... Возвращаемся в предыдущее окно".

Необходимо, чтобы при возникновении ошибки в вызываемой процедуре не приводило к краху вызывающей DLL программы, а также не выводились никакие системные сообщения об ошибках. ("Файл не найден....Нажмите ОК для завершения этой программы", "HALT" - такие сообщения приводят к краху вызывающей DLL программы).
Т.е. вызвали процедуру(функцию) из DLL, попытались открыть файлы. Если ошибка - то в конец процедуры без каких либо сообщений.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Delphi + Clarion DLL

Сообщение Yufil »

Посмотри Prop:MessageHook, можно перехватить сообщение в свою процедуру.
Пользовал для программ на web-сервере, в виде сервиса windows и для перехвата внезапных сообщений.
А дальше анализируем контекст и принимаем решение...
kreator
✯ Ветеран ✯
Сообщения: 5159
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Delphi + Clarion DLL

Сообщение kreator »

Если дело в открытии файлов/таблиц, то можно попробовать метод TryOpen. Он "втихую" пытается открыть файл. Если не удалось, то выйти из процедуры. Пример из жизни:

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

      if ~Access:FINT.TryOpen()          !  ПОПЫТКА ОТКРЫТЬ
  
        GTOP = GET_STRING('select VAL from nastr where PARAM = ''PATH_NEW''')  !   путь ШАРЫ
  
        DO CHECK_FIREBIRD

        Access:FINT.Close()

        return Level:Cancel    ! =========================  ВХОД В СИСТЕМУ  ==============================
  
      END
      
      ! Если таблица не открывается, то идём на окно выбора подключения к серверу Firebird
      
We are hard at work… for you. :)
Ответить