[]VC多进程程序 在线程内部怎么给局部CString变量赋值
[求助]VC多进程程序 在线程内部如何给局部CString变量赋值
我的程序大概是这样的:
我建立了一个单文档程序,主线程主要负责CView类得界面操作,而建立了几个线程主要负责抓取网页获取更新,而后报知。
程序源码为:
标红的地方本来是通过我文档中的一个抓取网页源码的封装类对象获取str地址的网页源码内容赋给contentStr,但是我跟了半天,contentStr总是空值,不知怎么回事,有没有大侠知道,指点一下。我放在View下的功能函数,可以实现抓取,可是放在线程中却内容为空。
------解决方案--------------------
我的程序大概是这样的:
我建立了一个单文档程序,主线程主要负责CView类得界面操作,而建立了几个线程主要负责抓取网页获取更新,而后报知。
程序源码为:
- C/C++ code
void CXXXView::OnSearchHand()//手动开始搜索 { // TODO: 在此添加命令处理程序代码 //for (int i=0;i<10;i++) //{ // ((CComboBox*)GetDlgItem(IDC_COMBO_ADDRESS))->SetCurSel(i); // ((CComboBox*)GetDlgItem(IDC_COMBO_ADDRESS))->GetWindowText(m_url[i]); //} //创建线程 //HANDLE hThread = CreateThread(NULL,0,GetWebProc,(LPVOID)m_url,0,NULL); ////关闭该线程句柄,释放其引用计数 //CloseHandle(hThread); HANDLE hThread1 = CreateThread(NULL,0,GetWebProc1,NULL,0,NULL); HANDLE hThread2 = CreateThread(NULL,0,GetWebProc2,NULL,0,NULL); HANDLE hThread3 = CreateThread(NULL,0,GetWebProc3,NULL,0,NULL); HANDLE hThread4 = CreateThread(NULL,0,GetWebProc4,NULL,0,NULL); HANDLE hThread5 = CreateThread(NULL,0,GetWebProc5,NULL,0,NULL); HANDLE hThread6 = CreateThread(NULL,0,GetWebProc6,NULL,0,NULL); HANDLE hThread7 = CreateThread(NULL,0,GetWebProc7,NULL,0,NULL); HANDLE hThread8 = CreateThread(NULL,0,GetWebProc8,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); CloseHandle(hThread3); CloseHandle(hThread4); CloseHandle(hThread5); CloseHandle(hThread6); CloseHandle(hThread7); CloseHandle(hThread8); hMutex = CreateMutex(NULL,FALSE,"XXX"); if (hMutex) { if (ERROR_ALREADY_EXISTS == GetLastError()) { MessageBox("本程序已经打开"); } return; } ReleaseMutex(hMutex); Sleep(4000); num_Count = 0; } //线程函数 DWORD WINAPI GetWebProc1(LPVOID lpParameter) { char m_url[256]; for (int j=40;j<50;j++) { WaitForSingleObject(hMutex,INFINITE); strcpy(m_url,strSite[j].GetBuffer(0)); //m_url = strSite[1]; ThreadOperator(m_url); } return 0; } //抓取网页,而后录取到数据库中 void ThreadOperator(char* str) { CGetWeb m_GetWeb; CString urlStr,contentStr; CTime tmSCan = CTime::GetCurrentTime(); //urlStr.Format("%s",str); if(![color=#FF0000]m_GetWeb.OnGetTheWeb((CString)str,contentStr))[/color] { AfxMessageBox(m_GetWeb.OnQueryErrer()); } contentStr = ReplaceWord(contentStr); //-------------------------------------------------- CADOConn m_AdoConn; m_AdoConn.OnInitADOConn(); //连接数据库 _bstr_t vSQL; vSQL = "SELECT * FROM Infor WHERE url='"+urlStr+"'"; _RecordsetPtr m_pRecordset; m_pRecordset = m_AdoConn.GetRecordset((_bstr_t)vSQL); CString szTime = tmSCan.Format("%Y-%m-%d %H:%M:%S"); if (!m_pRecordset->adoEOF) { CString str = VariantToString(m_pRecordset->GetCollect("webcontent")); if (str.Compare(contentStr) != 0) { sql_update(urlStr,contentStr,szTime); CString temp = urlStr + " at " + szTime + "have been updated"; temp +="\r\n"; ::PostMessage(AfxGetMainWnd()->m_hWnd,WM_UPDATE,(WPARAM)&temp,NULL); } } else { sql_update(urlStr,contentStr,szTime); CString temp = urlStr + " at " + szTime + "have been inserted"; temp +="\r\n"; ::PostMessage(AfxGetMainWnd()->m_hWnd,WM_UPDATE,(WPARAM)&temp,NULL); } }
标红的地方本来是通过我文档中的一个抓取网页源码的封装类对象获取str地址的网页源码内容赋给contentStr,但是我跟了半天,contentStr总是空值,不知怎么回事,有没有大侠知道,指点一下。我放在View下的功能函数,可以实现抓取,可是放在线程中却内容为空。
------解决方案--------------------