Delphi中使用多线程编程、DLL中如何创建窗体,这两个方面的文章网上非常多,我这里要说的是我在网上所没有找到的:
每一个插件就是一个DLL,里面都有窗体,加载插件的时候,需要为每一个插件分配一个线程。
在这种情况下,网上的代码就无能为力了,你将会发现一些问题:
1,非模态窗体只是闪烁一下又消失了;
2,模态窗体一直显示,也能处理各种窗体消息,但是主程序无法结束该线程;
3,如果没有结束线程,主程序退出时可能报非法引用内存错误;
4,……
总之,内存错误、程序不稳定之类的麻烦一大堆。
我的解决方法就是:在线程内部,接管该线程的消息循环。关于线程的消息循环,请自己查看相关资料,只要该线程调用了某些API函数,系统就会为其创建消息队列,该线程从而拥有消息循环。
下面给出关键语句,别的代码,我就不一一列出,要不,就不能突出本文重点了,只能告诉读者,别的代码,网上非常多。
在线程类的Execute方法中,使用以下语句来实现消息循环:
以下是代码片段: Plugins[PluginID].Running := False; If Start() Then // 加载成功了,下面的才有意义 Begin Try Plugins[PluginID].Running := true; While Not Terminated Do // 随时接受线程终止请求 Begin If WaitMessage() Then // 如果有消息,才继续执行,否则阻塞在这里 Begin Application.ProcessMessages(); // 分派处理消息 //Application.HandleMessage; End; End; Plugins[PluginID].Running := False; Except End; End;
|