Delphi + Clarion DLL
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
Добрый день спецы!
Необходима помощь.
Написана 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 находится на расшаренном ресурсе и юзают его очень многие.
И еще вопросик:
Клара может работать с потоками?
Из основного окна запустить с десяток потоков, которые должны работать одновременно и не тормозить поток основного окна.
Необходима помощь.
Написана 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 находится на расшаренном ресурсе и юзают его очень многие.
И еще вопросик:
Клара может работать с потоками?
Из основного окна запустить с десяток потоков, которые должны работать одновременно и не тормозить поток основного окна.
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
Имеете ввиду
Start(proc1)
Start(proc2)
Start(proc3)
proc1-proc3 - бесконечный цикл
И основное окно не будет тормозить?
Это ABC или шаблонный кларион?
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Delphi + Clarion DLL
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
С уважением, ДП
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
насколько я знаю 5.5 не умеет работать в реальном многопоточном режиме, активным поток может быть только один
START(MDI_FORM1)
START(MDI_FORM2)
Запускаем две формы, но активный поток (активная форма) может быть только один.
- Дед Пахом
- Старичок
- Сообщения: 3289
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 49 раз
- Контактная информация:
Delphi + Clarion DLL
Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
С уважением, ДП
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
Проверил на 6, работает!
Остается решить вопрос с управлением потоком и его приоритетом.
8 - одновременно запущенных потоков грузят i-7 4770K на 100% - ЭТО ППЦ
Приостановить поток на время.
Возобновить поток.
Изменить приоритет потока.
Передать в поток некие параметры.
Есть какая нить инфа?
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
СПС большое.
Остается разобраться как поставить приоритет потока.
Дельфийские параметры потока:
tpIdle
tpLowest
tpLower
tpNormal
tpHigher
tpHighest
tpTimeCritical
А аналоги в кларе?
-
- Новичок
- Сообщения: 17
- Зарегистрирован: 16 Апрель 2013, 16:34
Delphi + Clarion DLL
Провел испытания:
Код ошибка - 36; Файл - f:\DATA\Table_Data.dat; Месага - Invalid Data File
Если запускать DLL с интервалом каждую секунду вероятность возникновения ошибки большая (Процентов - 90%).
Если запускать DLL с интервалом каждые 10 секунд вероятность возникновения ошибки снижается существенно (Процентов - 1-2%).
Есть соображения на этот счет?
Такое ощущение, что как будто предыдущее закрытие файла не завершилось и попытка нового открытия файла приводит к ошибке.
Есть у кого опыт работы с FileManager?
Если используя FileManager открывать файлы и в определенный момент отвалится сетевой диск приведет ли это к ошибке с выводом сообщения "Файл не найден....Нажмите ОК для завершения этой программы", "HALT", или же при нарушении в ключе
"Ошибка KEY... при попытке доступа к файлу ... Возвращаемся в предыдущее окно".
Необходимо, чтобы при возникновении ошибки в вызываемой процедуре не приводило к краху вызывающей DLL программы, а также не выводились никакие системные сообщения об ошибках. ("Файл не найден....Нажмите ОК для завершения этой программы", "HALT" - такие сообщения приводят к краху вызывающей DLL программы).
Т.е. вызвали процедуру(функцию) из DLL, попытались открыть файлы. Если ошибка - то в конец процедуры без каких либо сообщений.
Код ошибка - 36; Файл - f:\DATA\Table_Data.dat; Месага - Invalid Data File
Если запускать DLL с интервалом каждую секунду вероятность возникновения ошибки большая (Процентов - 90%).
Если запускать DLL с интервалом каждые 10 секунд вероятность возникновения ошибки снижается существенно (Процентов - 1-2%).
Есть соображения на этот счет?
Такое ощущение, что как будто предыдущее закрытие файла не завершилось и попытка нового открытия файла приводит к ошибке.
Есть у кого опыт работы с FileManager?
Если используя FileManager открывать файлы и в определенный момент отвалится сетевой диск приведет ли это к ошибке с выводом сообщения "Файл не найден....Нажмите ОК для завершения этой программы", "HALT", или же при нарушении в ключе
"Ошибка KEY... при попытке доступа к файлу ... Возвращаемся в предыдущее окно".
Необходимо, чтобы при возникновении ошибки в вызываемой процедуре не приводило к краху вызывающей DLL программы, а также не выводились никакие системные сообщения об ошибках. ("Файл не найден....Нажмите ОК для завершения этой программы", "HALT" - такие сообщения приводят к краху вызывающей DLL программы).
Т.е. вызвали процедуру(функцию) из DLL, попытались открыть файлы. Если ошибка - то в конец процедуры без каких либо сообщений.
Delphi + Clarion DLL
Посмотри Prop:MessageHook, можно перехватить сообщение в свою процедуру.
Пользовал для программ на web-сервере, в виде сервиса windows и для перехвата внезапных сообщений.
А дальше анализируем контекст и принимаем решение...
Пользовал для программ на web-сервере, в виде сервиса windows и для перехвата внезапных сообщений.
А дальше анализируем контекст и принимаем решение...
-
- ✯ Ветеран ✯
- Сообщения: 5160
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Delphi + Clarion DLL
Если дело в открытии файлов/таблиц, то можно попробовать метод 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. 
