
关于MFC中多线程问题 50
现在有1个计算量大的计算和文件读写需要使用线程。环境采用的vc6.0的MFC框架。我试过staticDWORDWINAPIThreadProc(LPVOIDlpParam...
现在有1个计算量大的计算和文件读写需要使用线程。
环境采用的vc6.0的MFC框架。
我试过static DWORD WINAPI ThreadProc(LPVOID lpParameter);
由于计算中需要使用某个链接库函数,使用此链接库需要初始化一个对象,初始化过程在对话框生成的时候就完成。现在,在ThreadProc中调用链接库函数就会报错,并且我试过传对象指针、将对象设为全局变量也报错。错误是链接库函数报出来的,我也不知道什么原因。如果把链接库函数放到主线程里调用则没有错误。
我想解决的问题是:由于运算量大,不采用线程的话,运算过程中,对话框将会失去响应,我想保证在运算过程中对话框按钮也能响应。
大家有没有办法解决下?或者说,有没有别的办法实现?比如说能不能把运算放到主线程,把对话框响应过程放到创建的线程里呢?
谢谢了。
//a.h
#include "googleearth.h"
class CGEDlg : public CDialog
{
static DWORD WINAPI ThreadProc(LPVOID lpParameter);
}
//a.cpp
IApplicationGE m_geApplication;
double m_dLongitudeDif;
double m_dLatitudeDif;
void CGEDlg::OnInitDialog()
{
COleException * pError=NULL;
CString lpError;
if (!m_geApplication.CreateDispatch(CLSID_ApplicationGE,pError))
{
MessageBox("引用失败!");
pError->GetErrorMessage(lpError.GetBuffer(0),MAX_PATH);
MessageBox(lpError);
exit(0);
}
m_geHWnd=(HWND)m_geApplication.GetMainHwnd();
}
void CGEDlg::OnBTRun()
{
HANDLE hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
CloseHandle(hThread);
}
DWORD WINAPI CGEDlg::ThreadProc(LPVOID lpParameter)
{
m_geApplication.GetPointOnTerrainFromScreenCoords(-1,-1);
return 0;
//m_geApplication.GetPointOnTerrainFromScreenCoords(-1,-1);报错,报runtime error.
}
(CGEDlg*)lpParameter传递指针的方法也试过,一样runtime error 展开
环境采用的vc6.0的MFC框架。
我试过static DWORD WINAPI ThreadProc(LPVOID lpParameter);
由于计算中需要使用某个链接库函数,使用此链接库需要初始化一个对象,初始化过程在对话框生成的时候就完成。现在,在ThreadProc中调用链接库函数就会报错,并且我试过传对象指针、将对象设为全局变量也报错。错误是链接库函数报出来的,我也不知道什么原因。如果把链接库函数放到主线程里调用则没有错误。
我想解决的问题是:由于运算量大,不采用线程的话,运算过程中,对话框将会失去响应,我想保证在运算过程中对话框按钮也能响应。
大家有没有办法解决下?或者说,有没有别的办法实现?比如说能不能把运算放到主线程,把对话框响应过程放到创建的线程里呢?
谢谢了。
//a.h
#include "googleearth.h"
class CGEDlg : public CDialog
{
static DWORD WINAPI ThreadProc(LPVOID lpParameter);
}
//a.cpp
IApplicationGE m_geApplication;
double m_dLongitudeDif;
double m_dLatitudeDif;
void CGEDlg::OnInitDialog()
{
COleException * pError=NULL;
CString lpError;
if (!m_geApplication.CreateDispatch(CLSID_ApplicationGE,pError))
{
MessageBox("引用失败!");
pError->GetErrorMessage(lpError.GetBuffer(0),MAX_PATH);
MessageBox(lpError);
exit(0);
}
m_geHWnd=(HWND)m_geApplication.GetMainHwnd();
}
void CGEDlg::OnBTRun()
{
HANDLE hThread=CreateThread(NULL,0,ThreadProc,this,0,NULL);
CloseHandle(hThread);
}
DWORD WINAPI CGEDlg::ThreadProc(LPVOID lpParameter)
{
m_geApplication.GetPointOnTerrainFromScreenCoords(-1,-1);
return 0;
//m_geApplication.GetPointOnTerrainFromScreenCoords(-1,-1);报错,报runtime error.
}
(CGEDlg*)lpParameter传递指针的方法也试过,一样runtime error 展开
3个回答
展开全部
是哪个库函数调用出错?
访问全局变量、读写文件,你做了线程之间同步互斥吗?
可以用MsgWaitForMultipleObjects等待线程完成运算,而且不阻塞消息循环。
能编译链接通过应该跟编译选项没关系了。
但是有个问题:
GetPointOnTerrainFromScreenCoords的VC版本应该有3个参数才对呀,只有2个参数那是c#和VB的用法。
下面是VC的声明:
HRESULT GetPointOnTerrainFromScreenCoords ([in] double screen_x,[in] double screen_y,[out, retval] IPointOnTerrainGE **pPoint)
访问全局变量、读写文件,你做了线程之间同步互斥吗?
可以用MsgWaitForMultipleObjects等待线程完成运算,而且不阻塞消息循环。
能编译链接通过应该跟编译选项没关系了。
但是有个问题:
GetPointOnTerrainFromScreenCoords的VC版本应该有3个参数才对呀,只有2个参数那是c#和VB的用法。
下面是VC的声明:
HRESULT GetPointOnTerrainFromScreenCoords ([in] double screen_x,[in] double screen_y,[out, retval] IPointOnTerrainGE **pPoint)
展开全部
调整一下编译选项,选择多线程动态库支持
(CGEDlg*)lpParameter->m_geApplication...
遇到过这种问题,是msvcrt库升在windows级到sp1后造成的,当时我的解决办法就是静态编译,没别的方法了。
(CGEDlg*)lpParameter->m_geApplication...
遇到过这种问题,是msvcrt库升在windows级到sp1后造成的,当时我的解决办法就是静态编译,没别的方法了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程,计算过程为全局的东西,怎么可能会报错呢?CreateInstance,然后在ThreadProc响应,其中的所有变量都是全局的,假如与主线程有共用的变量,用CMutex的Lock,UnLock完全可以同步,使用多线程至今未出错,请将错误提示贴出,我也好学习下
实时错误,应该是工程设置问题,同意msfocus0314 观点
实时错误,应该是工程设置问题,同意msfocus0314 观点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询