我这样写线程会有问题吗?400分求助

jaffy 2009-02-03 04:54:29
这个帖子只能200,解决后发另一个帖子给分

我有个框架程序,这个框架程序中有两个线程,一个线程是显示进度,另一个运行业务

流程,之前将业务流程都写在本地程序中;后来为了扩展需要,将他们都分散集成在不

同DLL中,这些DLL都是包含界面的,然后由框架中的PANEL内嵌显示。我的业务流程就是

调用这些DLL的接口函数。

但现在问题来了,程序运行中会出现异常崩溃的情况,并且在DEBUG状态下非常常见,但

每次出现的位置不一样。出现错误后也无法定位,都是弹那个汇编窗口出来了,要么就

是报我的DLL有异常?还有就是"CANVAS DOES NOT ALLOW DRAWING"。

我估计是线程同步的问题,

下面是我的线程代码(非常简单,就是调用主框架中的某个函数)
__fastcall TMainThread::TMainThread(bool CreateSuspended,int index)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
m_index = index;
}
//---------------------------------------------------------------------------
void __fastcall TMainThread::Execute()
{
//---- Place thread code here ----
//Synchronize(UpdateMainForm);
Main->ThreadExecute(m_index); //调用主程序中的流程函数。
}

我之所以将Synchronize屏蔽了,是因为我发现如果这样调用的话,主框架完全无法响应

用户操作,我之前将代码放在主程序中时也是这样做的,从来没有这样频繁报错。

现在我想问的是,这样写线程到底有没有问题,会是DLL的问题吗?如果必须将代码放在DLL中调用,如何避免出错?
...全文
321 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaffy 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 jxw1987628 的回复:]
/*
是报我的DLL有异常?还有就是"CANVAS DOES NOT ALLOW DRAWING"。

如果是报这个错误,那应该是你在某个工作线程中对窗体界面操作时,主线程与其他操作界面的线程

冲突了,我记得Canvas类有Lock 和UnLock方法的,你试试代码中操作Canvas的部分加上这2个!

另外大部分VCL类不是线程安全的,也就是说要你自己加锁!
*/
[/Quote]
我现在已经在DLL中用定时器进行控制了,DLL中不在生成线程,效果还不错,那种频繁的崩溃报错,几乎没有了!
再多测试一段时间再结贴吧
jaffy 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 cczlp 的回复:]
在DLL中包含界面,这个设计思路就需要商榷。
界面的皮肤风格,基色,语言是编程者决定的,在DLL中界面很可能与主程序界面不统一。
用线程更新界面,Synchronize最好。或者向窗口发送消息,让窗口自己更新。实际这两种方式原理一样的。
[/Quote]
主要是我们组人太少,我想将核心功能封装在DLL中,外部程序想怎么记录控制,是由其他人来决定的。这样便于复用,只要用户不很强调界面;另外界面如果变化太多,还要考虑用户培训的问题。
wwp3321 2009-02-17
  • 打赏
  • 举报
回复
线程中也要更新界面的话,Canvas用前Lock一下,用完再解锁
防止冲突
cczlp 2009-02-16
  • 打赏
  • 举报
回复
在DLL中包含界面,这个设计思路就需要商榷。
界面的皮肤风格,基色,语言是编程者决定的,在DLL中界面很可能与主程序界面不统一。
用线程更新界面,Synchronize最好。或者向窗口发送消息,让窗口自己更新。实际这两种方式原理一样的。
jxw1987628 2009-02-16
  • 打赏
  • 举报
回复
/*
是报我的DLL有异常?还有就是"CANVAS DOES NOT ALLOW DRAWING"。

如果是报这个错误,那应该是你在某个工作线程中对窗体界面操作时,主线程与其他操作界面的线程

冲突了,我记得Canvas类有Lock 和UnLock方法的,你试试代码中操作Canvas的部分加上这2个!

另外大部分VCL类不是线程安全的,也就是说要你自己加锁!
*/

plax0850 2009-02-14
  • 打赏
  • 举报
回复
多测试测试,理一下思路.这种线程出问题,很麻烦,以前我也遇到类似的问题.修改了好久才搞定.我的观点是专门让一个线程更新数据显示,而另一个线程来做数据处理.
cccckaiji 2009-02-14
  • 打赏
  • 举报
回复
帮顶,学习
痞子酷 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 oyljerry 的回复:]
如果想流程清晰,应该把所有的UI都隔离在主框架等中,可以把UI放到DLL中,但最好这些UI的DLL也是跟主框架是一个整体的。
而业务方面的代码放在线程中,只处理业务逻辑,计算,算法等,然后需要修改UI等的时候,拿到框架指针等修改UI,或者发送消息给主框架来更新UI等,这样流程会清晰一些,查找逻辑也方便...
[/Quote]
---
支持ing
小笨象 2009-02-13
  • 打赏
  • 举报
回复
我觉得是冲突了。
考虑用同步锁吧。
或者,会更好。
oyljerry 2009-02-11
  • 打赏
  • 举报
回复
如果想流程清晰,应该把所有的UI都隔离在主框架等中,可以把UI放到DLL中,但最好这些UI的DLL也是跟主框架是一个整体的。
而业务方面的代码放在线程中,只处理业务逻辑,计算,算法等,然后需要修改UI等的时候,拿到框架指针等修改UI,或者发送消息给主框架来更新UI等,这样流程会清晰一些,查找逻辑也方便...
gjz_1209 2009-02-11
  • 打赏
  • 举报
回复
帮顶,学习
amdiqqqqq 2009-02-11
  • 打赏
  • 举报
回复
学习学习
xjq2003 2009-02-06
  • 打赏
  • 举报
回复
我来学习一下
jaffy 2009-02-05
  • 打赏
  • 举报
回复
我的线程希望是个灵活的流程,可以自己在外部设定。
yumikoo 2009-02-04
  • 打赏
  • 举报
回复
线程里调用DLL函数的代码看看
jaffy 2009-02-04
  • 打赏
  • 举报
回复
DLL内部也是有线程的,它们都各自显示自己的状态
jaffy 2009-02-04
  • 打赏
  • 举报
回复
DLL内部也是有线程的,它们都各自显示自己的状态
jaffy 2009-02-04
  • 打赏
  • 举报
回复
关键是线程中执行的函数实际上是DLL中的函数,难道需要在DLL中的函数里也加上Applicaiotn->ProcessMessages()
ydlchina 2009-02-04
  • 打赏
  • 举报
回复
在DLL中使用CreateThread建线程试试
yumikoo 2009-02-04
  • 打赏
  • 举报
回复
我理解的TCriticalSection一般是操作我们自定义线程的,而不能直接操作主框架
加载更多回复(16)

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧