Delphi + Clarion DLL
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- 
				Dark_Stranger
 - Новичок
 - Сообщения: 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 находится на расшаренном ресурсе и юзают его очень многие.
И еще вопросик:
Клара может работать с потоками?
Из основного окна запустить с десяток потоков, которые должны работать одновременно и не тормозить поток основного окна.
- 
				Dark_Stranger
 - Новичок
 - Сообщения: 17
 - Зарегистрирован: 16 Апрель 2013, 16:34
 
Delphi + Clarion DLL
Имеете ввиду
Start(proc1)
Start(proc2)
Start(proc3)
proc1-proc3 - бесконечный цикл
И основное окно не будет тормозить?
Это ABC или шаблонный кларион?
- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Delphi + Clarion DLL
Вообще-то не будет тормозить, но как напишешь...
START это встроенная функция, пофиг ABC это или XYZ.
С уважением, ДП
			
						- 
				Dark_Stranger
 - Новичок
 - Сообщения: 17
 - Зарегистрирован: 16 Апрель 2013, 16:34
 
Delphi + Clarion DLL
насколько я знаю 5.5 не умеет работать в реальном многопоточном режиме, активным поток может быть только один
START(MDI_FORM1)
START(MDI_FORM2)
Запускаем две формы, но активный поток (активная форма) может быть только один.
- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Delphi + Clarion DLL
Да, действительно, до 6-ки была кооперативная модель многопоточности. Давно с этим не работал, может кто другой просветит.
			
			
									
						С уважением, ДП
			
						- 
				Dark_Stranger
 - Новичок
 - Сообщения: 17
 - Зарегистрирован: 16 Апрель 2013, 16:34
 
- 
				Dark_Stranger
 - Новичок
 - Сообщения: 17
 - Зарегистрирован: 16 Апрель 2013, 16:34
 
Delphi + Clarion DLL
Проверил на 6, работает!
Остается решить вопрос с управлением потоком и его приоритетом.
8 - одновременно запущенных потоков грузят i-7 4770K на 100% - ЭТО ППЦ
Приостановить поток на время.
Возобновить поток.
Изменить приоритет потока.
Передать в поток некие параметры.
Есть какая нить инфа?
- 
				Dark_Stranger
 - Новичок
 - Сообщения: 17
 - Зарегистрирован: 16 Апрель 2013, 16:34
 
Delphi + Clarion DLL
СПС большое.
Остается разобраться как поставить приоритет потока.
Дельфийские параметры потока:
tpIdle
tpLowest
tpLower
tpNormal
tpHigher
tpHighest
tpTimeCritical
А аналоги в кларе?
- 
				Dark_Stranger
 - Новичок
 - Сообщения: 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 и для перехвата внезапных сообщений.
А дальше анализируем контекст и принимаем решение...
- 
				kreator
 - ✯ Ветеран ✯
 - Сообщения: 5235
 - Зарегистрирован: 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.   
			
						