Страница 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