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

jaffy 2009-02-03 05:03:10
这个帖子只能100,解决后发另一个帖子给分

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

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

同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中调用,如何避免出错?
...全文
185 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2009-02-06
  • 打赏
  • 举报
回复
如果运行业务的线程不需要牵涉UI更新,可以对更新进度的线程做一些处理操作UI控件的部分代码转移到中线程当中去执行即可。
eynStudio 2009-02-06
  • 打赏
  • 举报
回复
好帖子,学习了
simb 2009-02-06
  • 打赏
  • 举报
回复
时在不想用的话就把你的函数改成线程安全的就好了

simb 2009-02-06
  • 打赏
  • 举报
回复
你这样写,估计是有问题,不过也要看你调用的函数是不是线程安全的。建议使用Synchronize
yc_8301 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 liangpei2008 的回复:]
当一个线程写UI线程中的界面时,Canvas是线程安全的,Canvas资源已被加锁,而另一个线程同时也要访问从而产生"CANVAS DOES NOT ALLOW DRAWING"!
解决方法一般为采用线程同步的方式保证在一个时刻仅允许单一线程访问UI
[/Quote]
再顶。。学习了。。
关注。。。
starluck 2009-02-04
  • 打赏
  • 举报
回复


更新界面可能的問題在這裏。

嘗試通過消息來與UI交互。

如果是DLL,為什麼不深度用消息來處理呢。 至少有操作系統來做保障
liangpei2008 2009-02-04
  • 打赏
  • 举报
回复
当一个线程写UI线程中的界面时,Canvas是线程安全的,Canvas资源已被加锁,而另一个线程同时也要访问从而产生"CANVAS DOES NOT ALLOW DRAWING"!
解决方法一般为采用线程同步的方式保证在一个时刻仅允许单一线程访问UI
jaffy 2009-02-04
  • 打赏
  • 举报
回复
我线程中的函数就是执行DLL的接口函数,接口函数可能更新DLL自己的界面,也可能会触发主界面的更新
jiachangyu0 2009-02-04
  • 打赏
  • 举报
回复
没看懂!
lonelyriver 2009-02-04
  • 打赏
  • 举报
回复
……
jaffy 2009-02-04
  • 打赏
  • 举报
回复
线程的代码:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainThread.h"
#include "MainFrm.h"
#pragma package(smart_init)

__fastcall TMainThread::TMainThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
}
//---------------------------------------------------------------------------
__fastcall TMainThread::TMainThread(bool CreateSuspended,int index)
: TThread(CreateSuspended)
{
FreeOnTerminate=true;
m_index = index;
}
//---------------------------------------------------------------------------
void __fastcall TMainThread::UpdateMainForm()
{
Main->ThreadExecute(m_index);
}
//---------------------------------------------------------------------------
void __fastcall TMainThread::Execute()
{
//---- Place thread code here ----
//Synchronize(UpdateMainForm);
TCriticalSection * pSection=new TCriticalSection();
pSection->Enter();
Main->ThreadExecute(m_index);
pSection->Leave();
delete pSection;
}
//---------------------------------------------------------------------------

主界面中的ThreadExecute根据不同的index值执行不同的操作

如果要保持这样的结构,如何保证线程间的同步呢?
jaffy 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 starluck 的回复:]
更新界面可能的問題在這裏。

嘗試通過消息來與UI交互。

如果是DLL,為什麼不深度用消息來處理呢。 至少有操作系統來做保障
[/Quote]

你的意思是凡是涉及到界面更新都用消息。
DLL内部界面更新也用消息处理吗?
jaffy 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ralf__ 的回复:]
看起来想访问失败了
你的部分界面在DLL 中,那是不是有些对象没有实例化呢
[/Quote]
系统运行都还正常,DLL界面显示也正常,工作也正常;但会时不时崩溃
ralf__ 2009-02-04
  • 打赏
  • 举报
回复
看起来想访问失败了
你的部分界面在DLL 中,那是不是有些对象没有实例化呢
yc_8301 2009-02-04
  • 打赏
  • 举报
回复
好像很深奥,。。
关注。。。
starluck 2009-02-03
  • 打赏
  • 举报
回复
说错了,未进行异步操作就会:CANVAS DOES NOT ALLOW DRAWING



另外把异步操作的代码看下;

建议尽量不要在线程中与UI交互,尝试改进使用消息的队列来处理。
starluck 2009-02-03
  • 打赏
  • 举报
回复
异步操作涉及到了UI的操作才会出现CANVAS DOES NOT ALLOW DRAWING


Synchronize(UpdateMainForm);
这个里面执行了什么,贴出来
UndefinedCoder 2009-02-03
  • 打赏
  • 举报
回复
not interested in C++ Builder
-海盗旗- 2009-02-03
  • 打赏
  • 举报
回复
主程序 和dll 同步比较麻烦。

呵呵。。。我也有遇到过。


在设计程序的时候最好能避免这样的问题的 最好。


要么 可以尝试用消息控制吧!
Harryfin 2009-02-03
  • 打赏
  • 举报
回复
凡是在线程中涉及和UI交互的,必须使用Synchronize,否则就很有可能“CANVAS DOES NOT ALLOW DRAWING”,所以Synchronize这里要先保证,然后从其它地方找原因。
加载更多回复(7)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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