Страница 1 из 1
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 15:54
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 находится на расшаренном ресурсе и юзают его очень многие.
И еще вопросик:
Клара может работать с потоками?
Из основного окна запустить с десяток потоков, которые должны работать одновременно и не тормозить поток основного окна.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:03
Дед Пахом
Насчёт потоков - да, конечно, смотри START.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:11
Dark_Stranger
Дед Пахом писал(а): Насчёт потоков - да, конечно, смотри START.
Имеете ввиду
Start(proc1)
Start(proc2)
Start(proc3)
proc1-proc3 - бесконечный цикл
И основное окно не будет тормозить?
Это ABC или шаблонный кларион?
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:13
Дед Пахом
Dark_Stranger писал(а): И основное окно не будет тормозить?Это ABC или шаблонный кларион?
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:25
Dark_Stranger
Дед Пахом писал(а): Dark_Stranger писал(а): И основное окно не будет тормозить?Это ABC или шаблонный кларион?
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
насколько я знаю 5.5 не умеет работать в реальном многопоточном режиме, активным поток может быть только один
START(MDI_FORM1)
START(MDI_FORM2)
Запускаем две формы, но активный поток (активная форма) может быть только один.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:32
Дед Пахом
Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:33
Dark_Stranger
Дед Пахом писал(а): Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
А в 6 таких проблем нет?
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:34
Дед Пахом
Да вроде нет.
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:50
Dark_Stranger
Дед Пахом писал(а): Да вроде нет.
Проверил на 6, работает!
Остается решить вопрос с управлением потоком и его приоритетом.
8 - одновременно запущенных потоков грузят i-7 4770K на 100% - ЭТО ППЦ
Приостановить поток на время.
Возобновить поток.
Изменить приоритет потока.
Передать в поток некие параметры.
Есть какая нить инфа?
Delphi + Clarion DLL
Добавлено: 04 Май 2016, 16:52
Дед Пахом
смотри SUSPEND, RESUME, NOTIFY
Delphi + Clarion DLL
Добавлено: 05 Май 2016, 8:09
Dark_Stranger
Дед Пахом писал(а): смотри SUSPEND, RESUME, NOTIFY
СПС большое.
Остается разобраться как поставить приоритет потока.
Дельфийские параметры потока:
tpIdle
tpLowest
tpLower
tpNormal
tpHigher
tpHighest
tpTimeCritical
А аналоги в кларе?
Delphi + Clarion DLL
Добавлено: 05 Май 2016, 11:41
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, попытались открыть файлы. Если ошибка - то в конец процедуры без каких либо сообщений.
Delphi + Clarion DLL
Добавлено: 05 Май 2016, 17:38
Yufil
Посмотри Prop:MessageHook, можно перехватить сообщение в свою процедуру.
Пользовал для программ на web-сервере, в виде сервиса windows и для перехвата внезапных сообщений.
А дальше анализируем контекст и принимаем решение...
Delphi + Clarion DLL
Добавлено: 05 Май 2016, 18:03
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