问题描述
Pascal Lazarus。
首先,我提前感谢协助,对于我认为有必要解释的长文,我深表歉意。和英文不好 - 我正在使用谷歌翻译器。
我构建了一个由几个程序(exe)组成的模块化程序,在某些情况下,这些模块也在DLL中。大约有6个模块。
所有这些模块都使用Thread的功能。这个线程不使用可视化组件,它的作用基本上是分析巨大的文件(> 1GB)。
为了提高效率和组织,提取与此有关的所有代码文件分析,由每个模块使用。这有助于更新和查找错误。
线程在正常工作之前没有任何代码更改,除非需要调整它们到DLL项目。
现在,当我运行Thread的过程时,除了synchronized()方法之外,所有功能都正常运行,它会冻结而不会发生错误或锁定主程序。
使用synchronize()方法,因为线程完全在DLL内创建。因此,主程序被称为过程DLL,它创建和运行线程,无需主程序的任何干预。
对于此过程,传递了几个参数,一个他们是一个类型指向程序 ^程序的指针,谁将它用作事件,由线程通过synchronize()定期触发,确保在表现,在大多数时候持续超过一个小时,如果跟踪进度,查看错误错误等。
我在谷歌搜索但没有找到信息,除了有人说可能的是,synchronize()方法正在等待主进程因为未知的原因而没有响应。
注意:主程序和窗口不锁定或冻结;只有线程不调用/运行程序提供给synchronize();我确认了!
添加
Nota2:我想避免这么多使用PostMessage()或类似的,因为它强制我包括LCL,这使得DLL文件从当前的300K升级到2MB(在发布模式下)。除此之外,有报道说它的运作不尽如人意。
感谢帮助。
原始语言(PT_BR):
synchronize()em DLL congela,sem erros e travamentos。在拉撒路的
帕斯卡。
Primeiramente,agradeçodeantemãoa ajuda,epeçodesculpa pelo longo texto que acheinecessaryáriopara explicar; eopéssimoinglês - estou usando google translator。
Eustructíum programa modular,composto deváriosprogramas(exe)e,em alguns casos estesmódulostambémestãoem DLL。存在cerca de 6módulos。
Todos estesmódulosutilizavamfunçõesde uma Thread。 Este threadnão美国组件visaais,o que ela fazébasicamente analisar arquivos gigantescos(> 1GB)。
Para melhorar aeficiênciaeorganização,extraítodo o oo oo oo análisede arquivo,queéusado por cada um dosmódulos。
Os线程funcionavam normalmente antes,nãohouvealteraçãodocódigo,exceto onecessaryárioparaadaptá-los ao projeto DLL。
Agora,quando executo os proceduresimentos da Thread,tudo funciona normalmente,exceto ométodosynchronize(),que congela sem emitir erros ou travar o programa principal。
Ométodosynchronize()éusado porque os threadsãocriados inteiramente dentro da DLL。 Por isso,no programa principaléchamado um proceduresimenta da DLL que cria e executa o thread,sem qualificationintervençãodo programa principal。
Para este proceduresimentosãopassadosváriosparâmetro,um deleéum tipo de ponteiro para procedure,queméusando como um evento,disparado pelo threadatravésdo synchronize()periodicamente,garantido que durante aexecução,que dura mais de 1 se na na oria zes zes synchronize synchronize synchronize。。。。。。。。。。。。。synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize synchronize do do do do do do do do do do do do do ()esta aguardando o processo principal quenãoestárespondendo por motivos desconhecidos。
Nota:O programa principal e janelanãotravam nem congelam,apenas o thread,que nem mesmo executa一个程序,用于同步(); verifiquei isso!
添加
Nota2:我想避免尽可能多的使用PostMessage()或类似的,因为它强制我包括LCL,这使得DLL文件从当前的300K升级到2MB(在发布模式下)。除此之外,有报道说它的运作不如预期的那样。
Agradeçoa ajuda。
这是因为你有两个完整的实例(RTL,LCL等)。一个设置在DLL中,一个设置在EXE中。代码和数据。
你可能会调用DLL的同步,它将DLL调用它来执行DLL中的LCL循环,因为所有的工作都在EXE。
这将很难解决,基本上你需要这个包。部分原因是线程参与会进一步复杂化,因为线程变量(线程本地存储)对于DLL和EXE线程可能有不同的设置。
对于这个需要软件包,只需一个副本即可解决这个问题。查看更多论文的链接。
Pascal Lazarus.
First, I thank in advance to help, and I apologize for the long text that I found it necessary to explain; and English bad - I'm using google translator.
I built a modular program consisting of several programs (exe), and in some cases these modules are also in DLL. There are about 6 modules.
All of these modules used functions of a Thread. This thread does not use visual components, what it does is basically analyze huge files (> 1GB).
To improve the efficiency and organization, extract all the code relating to this file analysis, which is used by each of the modules. This facilitates updating and find error.
The threads worked normally before, no code change, except as necessary to adapt them to the DLL project.
Now, when I run the procedures of Thread, everything functions normally except the synchronize () method, which freezes without making errors or lock the main program.
The synchronize () method is used because the threads are created entirely within the DLL. Therefore, the main program is called a procedure DLL, which creates and runs the thread, without any intervention by the main program.
For this procedure are passed several parameters, one of them is a type "pointer to procedure" ^procedure, who is using it as an event, fired by the thread through the synchronize () periodically, ensuring that during the performance, which lasted more than one hour in most sometimes, if track progress, see errors errors among others.
I searched on google but did not find information except someone saying that possibly the synchronize () method is waiting for the main process that is not responding for unknown reasons.
Note: The main program and the window does not lock or freeze; only the thread that does not call / run procedure provided to synchronize (); I confirmed it!
Added
Nota2: I want to avoid as much use PostMessage () or similar, because it forces me to include LCL, which makes the DLL file up from the current 300K to 2MB (in release mode). Apart from that there are reports that its operation is not good as expected.
I appreciate the help.
Original Language (PT_BR):
synchronize () em DLL congela, sem erros e travamentos.Pascal in Lazarus.Primeiramente, agradeço de antemão a ajuda, e peço desculpa pelo longo texto que achei necessário para explicar; e o péssimo inglês - estou usando google translator.
Eu construí um programa modular, composto de vários programas (exe) e, em alguns casos estes módulos também estão em DLL. Existem cerca de 6 módulos.
Todos estes módulos utilizavam funções de uma Thread. Este thread não usa componentes visuais, o que ela faz é basicamente analisar arquivos gigantescos (>1GB).
Para melhorar a eficiência e organização, extraí todo o código relativo à esta análise de arquivo, que é usado por cada um dos módulos. Isso facilita atualização e encontrar erro.
Os threads funcionavam normalmente antes, não houve alteração do código, exceto o necessário para adaptá-los ao projeto DLL.
Agora, quando executo os procedimentos da Thread, tudo funciona normalmente, exceto o método synchronize (), que congela sem emitir erros ou travar o programa principal.
O método synchronize () é usado porque os threads são criados inteiramente dentro da DLL. Por isso, no programa principal é chamado um procedimento da DLL que cria e executa o thread, sem qualquer intervenção do programa principal.Para este procedimento são passados vários parâmetro, um dele é um tipo de ponteiro para procedure, quem é usando como um evento, disparado pelo thread através do synchronize () periodicamente, garantido que durante a execução, que dura mais de 1 hora na maioria das vezes, se acompanhe o progresso, veja erros os erros dentre outros.
Procurei no google, porém não encontrei informação, exceto alguém falando que possivelmente o método synchronize () está aguardando o processo principal que não está respondendo por motivos desconhecidos.
Nota: O programa principal e janela não travam nem congelam, apenas o thread, que nem mesmo executa a procedure fornecida em synchronize (); verifiquei isso!
Added
Nota2: I want to avoid as much use PostMessage () or similar, because it forces me to include LCL, which makes the DLL file up from the current 300K to 2MB (in release mode). Apart from that there are reports that its operation is not good as expected.
Agradeço a ajuda.
That is because you have two complete instances of everything (RTL,LCL etc). One set in the DLL, one set in the EXE. Both code and data.
You are probably calling the synchronize of the DLL, which schedules it for the LCL loop in the DLL which does nothing, since all work is done in the EXE.
This will be very hard to fix, basically you need packages for this. Partially also because the thread involvement will further complicate it because of threadvariables (Thread local storage) that is set up potentially differently for DLL and EXE threads.
For this one needs packages which is only in its initial stages and solves this by having only one copy of everything. See the link for a deeper treatise.
这篇关于Synchronize()DLL冻结没有错误和崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!