关于BCB中用多线程实现gif动画

GoingMerry 2015-02-02 11:19:35
我在主线程中 实现业务处理流程 然后在开始的时候 创建一个线程 用来 弹出一个窗体 窗体中放了个TImage 显示个gif动画 然后想在主线程中业务处理完成之后关掉这个窗体。 但是我实现之后出现非法访问的错误。 代码如下 求指导 谢谢。

自定义的线程类的cpp
extern String progressMsg;

__fastcall TGifThread::TGifThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}

void __fastcall TGifThread::Execute()
{
// pLock->Acquire();
Synchronize(doShowProgress);
// pLock->Release();
}

void __fastcall TGifThread::doShowProgress()
{
ShowProgressForm->doShow(InputWSHForm, progressMsg);
}

void __fastcall TGifThread::doCloseProgress()
{
ShowProgressForm->doClose();
}


主线程中调用
TGifThread *GifThread;
GifThread = new TGifThread(false);
///////////////////////////////////////////////////////////////////////
业务处理代码
///////////////////////////////////////////////////////////////////////
关闭弹出的窗体
...全文
279 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zdrone 2015-04-21
楼主的代码不够清晰,没法判断问题原因。VCL控件理论上是线程不安全的,Synchronize(doShowProgress);这个过程不受控制,有可能产生非法访问的问题,这也是C#中线程操作其他界面控件必须要通过委托类的原因。另外把业务逻辑放到主界面中处理不妥,会造成程序失去响应等问题,建议考虑是否通过以下方法实现: 把业务放到一个子线程去处理,子线程处理过程中,给主界面发送一个消息,主界面接收到消息后,弹出你的gif动画窗口,子线程处理到一个阶段需要gif窗口消息,则再想主线程发送一个消息,由主线程发消息给gif窗口,调用close()方法关闭,因为gif窗口是在子线程创建后产生的,如果需要子线程给gif窗口发送消息,需要有一个gif的handle,需要在子线程运行中赋值,可能会产生风险,由主界面(相当于parent窗口)控制比好。 这样的好处是: 1 主界面(主线程)只负责调度各业务,没有批量任务,不会失去响应。 2 子线程负责处理业务,通过消息进行通讯,是安全的。 3 由主界面控制各子界面或者子线程,不会产生风险。
回复
xiao_la_mu 2015-04-21
个线程就够了吧
回复
GoingMerry 2015-02-02
引用 1 楼 songhtao 的回复:
你应该在主线程里发消息通知gif线程自己关闭窗体
而且 GifThread = new TGifThread(false); 这句之后 不会立刻执行线程类里的 excute 这是为什么?
回复
GoingMerry 2015-02-02
引用 1 楼 songhtao 的回复:
你应该在主线程里发消息通知gif线程自己关闭窗体
您好 请问我的代码 自定义线程那块是没有问题的是么?另外您的主线程中发消息通知gif线程自己关闭窗体 没太明白 是说gif线程类中实现一个函数 用来关闭弹出的窗体 然后主线程中以SendMessage的形式 通知gif线程类 调用关闭函数? 另外 再说下我现在的情况 现在在form1中做业务处理 做业务处理之前 先用线程类 调用form2(form2中有gif图片),然后业务处理做完之后 想关闭form2
回复
我不懂电脑 2015-02-02
你应该在主线程里发消息通知gif线程自己关闭窗体
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2015-02-02 11:19
社区公告
暂无公告