这个帖子只能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中调用,如何避免出错?
__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中调用,如何避免出错?
MainTest = NULL;就是这了,再没有写代码了
在设计程序的时候最好能避免这样的问题的 最好。
要么 可以尝试用消息控制吧!
Synchronize(UpdateMainForm);
这个里面执行了什么,贴出来
你的部分界面在DLL 中,那是不是有些对象没有实例化呢
你的意思是凡是涉及到界面更新都用消息。
DLL内部界面更新也用消息处理吗?
#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值执行不同的操作 如果要保持这样的结构,如何保证线程间的同步呢?
解决方法一般为采用线程同步的方式保证在一个时刻仅允许单一线程访问UI