我正在尝试将一些代码移动到共享库中(在独立编译时工作正常)但是遇到了类内联函数的一些问题.mingw/gcc v4.7.2.
部分问题似乎是因为我更喜欢在类声明之外定义我的内联函数(它使类声明更整洁,更容易阅读).我一直认为这是可以接受的,等同于在类声明中定义......但似乎并非总是如此.我已经创建了一个简单的示例来演示问题.(显然dllexport通常会在宏中导入/导出.)
标题:
// Uncomment one at a time to see how it compiles with: -O2 -Winline
//#define INLINE_OPTION 1 // implicit - builds without inline warnings
#define INLINE_OPTION 2 // simple external inline - gives inline warnings
//#define INLINE_OPTION 3 // external forced inline - gives inline errors
class __attribute__((dllexport)) Dummy {
public:
Dummy() : m_int{0} {}
~Dummy() {}
#if INLINE_OPTION == 1
int get_int() const { return m_int; }
#else
int get_int() const;
#endif
int do_something();
private: …Run Code Online (Sandbox Code Playgroud) 使用RAD Studio(Delphi)v10.2.1(东京版本1)在Windows 10"Creators Update"64bit上进行开发,但是32位开发.
该应用程序是具有多个后台线程的VCL,每个线程使用Indy TidHTTP来获取网络资源.主线程和后台线程之间的同步使用消息队列(PostThreadMessage调用)实现.这很复杂,在这里提供直接代码将是困难和混乱的,所以我开始用口头描述.
应该发生什么:打开一个带有外部资源链接的文件,这会生成HTTP请求并将它们移交给后台处理,然后等待应用程序消息队列上的传入消息,说明资源已被下载.应用程序消息在分配给TApplication.OnMessage的事件代码中匹配(我怀疑,这是我的问题所在).
有用.一切都顺利进行.但是如果我打开一个TSaveDialog - 即使我取消了对话而不是实际做任何事情 - 那么应用程序消息队列中的消息就会丢失.
通过编写日志消息的过程(不可能直接调试,因为这会扰乱导致问题所需的时间)我已经知道后台线程确实发布消息(并从PostThreadMessage获得肯定的响应),但是他们永远不会出现在我的TApplication.OnMessage事件代码中.
我已经看到各种库中的一些偷偷摸摸的代码将建立自己的PeekMessage/TranslateMessage/DispatchMessage循环,但并非所有人都记得检查是否存在TApplication.OnMessage事件.但我刚刚搜索了VCL代码和我正在使用的十几个第三方库,并且没有发现任何这种情况会在这种情况下受到影响(据我所知).
注意:我使用的是madExcept,Indy,FastReport,AddictSpell,SynEdit,VclStyleUtils(在其他一些不太知名的库中)
注2:我想知道它是否与Delphi 10.2.1或Windows 10 Creator的更新有关,因为我也看到了一些其他奇怪的行为(第一个例外的长延迟或第一个TOpenDialog - 但仅限于某些应用程序)绝对不会发生10.1(我没有使用10.2.0).......但这可能(可能是)有所不同.
所以我的问题是:我能做些什么呢?
有关如何查找/验证是否有其他代码窃取应用程序消息的任何建议?我还应该搜索除PeekMessage之外的其他东西吗?
是否有其他方法可以拦截可能让我避免此问题的应用程序消息队列消息?
如果没有更好的选项显示自己,我可能不得不放弃使用应用程序线程消息并实现我自己的消息/同步系统,在其他时间让其他人工作得非常好之后我宁愿不做.