void CMainFrame::OnImport()
{
hRunThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)&pRunExcelThread, (void *)this, 0, &dwRunThreadID);
}UINT pRunExcelThread (void* p)
{
if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox("OLE初始化出错!");
}
CMainFrame *pMF = (CMainFrame*)p; _ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
m_pConnection.CreateInstance(_uuidof(Connection));
m_pConnection->Open ("xxxxx", "", "", adModeUnknown);
m_pCommand.CreateInstance (__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = adCmdStoredProc; m_pCommand->CommandText=_bstr_t(_T("PROCE_DATAIMPORT_MERCHANT")); //SP Name proce_DataImport_Merchant
m_pCommand->Parameters->Refresh();
m_pCommand->Parameters->Item[_variant_t (_bstr_t ("merchid"))]->Value=_variant_t ("301110054110169");
m_pCommand->Parameters->Item[_variant_t (_bstr_t ("merchname"))]->Value=_variant_t ("华糖洋华堂商业有限公司");
m_pCommand->Execute (NULL, NULL, adCmdStoredProc); if (m_pCommand!=NULL)
m_pCommand.Release();
if ((m_pConnection!=NULL) && (m_pConnection->State))
{
m_pConnection->Close();
m_pConnection.Release();
}
m_pConnection = NULL;
m_pCommand = NULL;
}
::PostMessage ( pMF->m_hWnd, WM_END_THREAD, (WPARAM) 0, (LPARAM) 0);
return 0;
}
//PostMessage里WM_END_THREAD 为自定义消息:
LONG CMainFrame::OnEndThread (WPARAM w, LPARAM l)
{
if (NULL != hRunThread)
CloseHandle (hRunThread);
CClientDC dc (this -> GetActiveView ());
dc.TextOut (0, 0, "执行结束...");
hRunThread = NULL;
return 0;
}view显示 “执行结束”,线程里也正确执行了。这时。界面假死,点击任何都没反应,只能强制退出~~~ 谁能解释一下,困扰小弟一天了~~~~~~~~~~~~~~~
解决方案 »
- 求一个需要用到多线程并且需要处理同步问题的例子~~
- select没阻塞?
- MFC对话框OnInitDialog()中放入创建线程来实现端口监听,报错local function definitions are illegal
- 如何发送位图的信息头和象素数据阵列
- 郁闷,加了背景图后,发现每次重画一次内存的使用就会增加上去!一百遍啊,一百遍~~~
- 关于系统托盘的问题?
- 各位兄台,小弟在运行一个例程时提示需要mfc42ud.dll,翻遍硬盘也没找到!哪位有给俺email一个,谢了先!
- 请问如何枚举本机的所有的网卡和modem,并且获得他们的名称,IP地址和子网掩码?
- combobox是不是没法捕获回车的消息?
- 那位高手给提供讲解一下COM的使用,入门教程,急!
- AfxMessageBox灵活使用的问题,急!
- 【求教】关于MSDN的sample里diblook图片滚动不变乱靠什么保证
试试看这样void CMainFrame::OnImport()
{
CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)pRunExcelThread, (void *)this, 0, &dwRunThreadID);
}UINT pRunExcelThread (void* p)
{
...
m_pConnection = NULL;
m_pCommand = NULL;
}获得主窗口的指针
CClientDC dc 主窗口指针 -> GetActiveView ());
dc.TextOut (0, 0, "执行结束...");
}
不过我是这样写的
AfxBeginThread(MyThreadProc,0,THREAD_PRIORITY_BELOW_NORMAL);
和你一样
MyThreadProc中用了ado,进行大量的操作
AfxBeginThread(MyThreadProc,0,THREAD_PRIORITY_BELOW_NORMAL);
我用这个创建线程就好了
用createthread 创建就界面就假死了呵呵。奇怪
不知道你怎么用ado的
我起了一个线程,这是线程里的部分每过一分钟链接次数据,然后释放,但是我发现内存不停的涨。。虽然涨幅很小。
UINT pRunThread (void * p)
{ if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox("OLE初始化出错!");
}
while (!g_bEndThread)
{
iTest = time(NULL) - t;
if ( iTest >= 60 * 1)
{
if (pAdCn->Open (acConnStr))
{
pAdCn->Close ();
}
t = time(NULL);
}
Sleep(1);
}
}
Open 和 close都封装在一个类里
bool CADOConnection::Open (char *acConnStr)
{
HRESULT hr = m_Con.CreateInstance ("ADODB.Connection");
if(SUCCEEDED (hr))
{
m_Con->Open (acConnStr, "", "", adModeUnknown);
}else
{
AfxMessageBox("创建_ConnectionPtr对象失败");
m_Con.Release ();
m_Con=NULL;
return false;
}
hr = m_cmmd.CreateInstance(__uuidof(Command));
if(FAILED(hr))
{
AfxMessageBox("创建_CommandPtr对象失败");
m_cmmd.Release ();
m_cmmd=NULL; m_Con.Release ();
m_Con=NULL;
return false;
} m_cmmd->ActiveConnection = m_Con;
m_cmmd->CommandType = adCmdStoredProc;
return true;
}
bool CADOConnection::Close (void)
{
if (m_cmmd!=NULL)
m_cmmd.Release();
if ((m_Con!=NULL) && (m_Con->State))
{
m_Con->Close();
m_Con.Release();
}
m_Con = NULL;
m_cmmd = NULL; return true;
}你不停的调用试过吗?
MFC环境使用AfxBeginThread(),如果你不想用这个,至少要用_beginthread()。
其原因是库函数的线程环境问题。
AfxBeginThread()创建并维护MFC函数的线程环境,_beginthread()创建并维护C\C++库函数的线程环境。
SetThreadPriority(pThread,THREAD_PRIORITY_TIME_CRITICAL);