Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Работа Новый топик    Ответить
 Есть работа  [new]
vlkc
Member

Откуда:
Сообщений: 65
Добрый вечер, нужен проф (платная консултация) по токому вопросу: есть код, который ведет себя непредсказуемо. Конкретно:

Стартую поток...

  FThread := TWorkerThread.Create(true);
  FThread.FreeOnTerminate := true;
  FThread.Start;


Потом внем работю с длл

try
              
   Try

       raise Exception.Create('Test Exception'); ----<<<< если здесь проблемы нету

       candidates:= Processor_analyze(proc,p,3*W, W, H,StrToInt(max_height)); ----<<<< из длл

       raise Exception.Create('Test Exception'); ----<<<< если здесь проблемы нету
    
   except
      //
   end;

   raise Exception.Create('Test Exception'); ----<<<< если здесь - вырубает весь софт

except
    on E: Exception do begin
        //
    end;
end;


дам удаленно подключится. Сменя на пиво 50 USD. Контакт: vlkc eta list.ru
3 сен 19, 19:01    [21962808]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58486
Блог
Прежде всего вот это:

except
    on E: Exception do begin
        //
    end;
end;


замени на что-нибудь типа

except
  MessageBox('except object = ' + IntToStr(ExceptObject), '1');    
  MessageBox('except object class = ' + ExceptObject.ClassName, '2');    
end;


и посмотри, что будет. А вообще, думаю, тебе будет быстрее толково написать свою задачу в форум Delphi - за $50 соображающий человек напрягаться не станет, а вот щёлкнуть задачку кто-нибудь да захочет.
3 сен 19, 20:35    [21962850]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
n_di1024
Member

Откуда:
Сообщений: 8
1. необработанный эксепшн в dll приводит к ее выгрузке
2. Ваш блок try except позволит отловить ошибки вызова функции dll но не ошибки внутри dll
3. желательно и очень рекомендуется чтобы dll и используемый ее экзешник были собраны с одной версией компилятора
4. существуют разные спецификации вызовов и соответственно, передачи параметров в dll. они должны быть одинаковы. в дельфи директива указывается после метода (например stdcall). если Вы вызываете из dll написанной на С то там наверняка отличается способ передачи параметров - там скорее всего cdecl; в таки случаях часть параметров может быть передана неправильно, вызов происходит но параметры не те передаются.
подробнее здесь:
https://en.wikipedia.org/wiki/X86_calling_conventions
и здесь:
https://www.swissdelphicenter.ch/en/showcode.php?id=1233

5.выравнивание данных в настройках компилятора (data align)- тоже должно совпадать
6.если dll использует визуальные компоненты или доступ к ним используется из потока - отдельная тема - называется thread safe VCL,
и она вроде как стала работать ровно в последних версиях дельфи. в старых можно легко поймать AV при одновременном обращении с классу VCL.
7. дальше - логические ошибки - даже если все вышеперечисленное соблюдено можно все равно наступить на грабли - одновременное обращение к одним и тем же данным - пример - два потока меняют одно и тоже значение - один отнимает единицу другой прибавляет.
нет никакой гарантии то значение будет то прежнее после арифметики - один поток может получить больше времени и отнимет/прибавит значение дважды.
8. в дельфи шаблон длл содержит глобальные переменные для классов форм - это зло и точно приведет к проблемам. не должно быть глобальных переменных в dll. это прокатывает если один экзешник и одна длл. но не будет работать если многопоточность или несколько разных экзешников используют общую dll. все переменные должны быть локальные либо объявлены как свойства/поля класса.

что делать: - добавить ведение лога. отладить вызов длл без потоков. почитать про семафоры/критические секции
4 сен 19, 09:45    [21963012]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
n_di1024
Member

Откуда:
Сообщений: 8
да, и loadLibrary не видно, если там конечно не статическое связываение
4 сен 19, 09:47    [21963015]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58486
Блог
n_di1024
1. необработанный эксепшн в dll приводит к ее выгрузке

Как страшно жить.
4 сен 19, 12:04    [21963216]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34487
n_di1024
1. необработанный эксепшн в dll приводит к ее выгрузке


Э... Точно? Или ТОЧНО?
4 сен 19, 18:46    [21963813]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58486
Блог
MasterZiv
Э... Точно? Или ТОЧНО?

Думаю, коллега спутал с тем, что не обработанное в потоке исключение вырубает всё приложение.
4 сен 19, 18:50    [21963822]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
vlkc
Member

Откуда:
Сообщений: 65
Фокусы каких невидел ... :) убрал блок try except вокруг функции и начало работать как часы. Как обяснить без понятия?

try
              
   Try   ----<<<< убрал

     candidates:= Processor_analyze(proc,p,3*W, W, H,StrToInt(max_height)); ----<<<< из длл
    
   except  ----<<<< убрал
      //
   end;  ----<<<< убрал

   raise Exception.Create('Test Exception'); ----<<<< тепер здесь не вырубает :)

except
    on E: Exception do begin
        //
    end;
end;
4 сен 19, 22:31    [21964026]     Ответить | Цитировать Сообщить модератору
 Re: Есть работа  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7063
vlkc,

Разрушение стека памяти.
4 сен 19, 22:54    [21964035]     Ответить | Цитировать Сообщить модератору
Все форумы / Работа Ответить