vc資料庫多線程
❶ VC++多線程
暈,你這樣怎麼可能成功呢
AfxGetApp()函數也就是得到當前的應用(線程),你新建的線程,得到的就是你新建線程的數據,當然是 0xcccccccc了。
下面的幾句也不用說了,也是這個問題!
要想得到宿主線程的數據,定義一個數據結構,將這些數據都保存進去,通過AfxBeginThread 的第二個參數,傳給線程過程。在線程過程裡面處理就行了
❷ vc多線程參數傳遞問題
可以這樣做:
為線程參數定義一個結構體
struct threadParam
{
HANDLE* self;
HANDLE* other;
//還可以定義一些其他你認為需要的參數
};
//假設有2個線程A、B
HANDLE *HA = new HANDLE;
HANDLE *HB = new HANDLE;
threadParam *pA = new threadParam;
PA->self = HA;
PA->other = HB;
*HA = createthread(NULL,funcA,PA,....);
將PA做為參數傳遞給線程A。這樣就可以在線程函數里通過指針使用a,b的線程句柄了。
同樣創建b線程的時候這樣做一遍就ok。
不知道這樣說明白否?
❸ 怎麼在vc中實現多線程
控制台應用程序中的一個小例子
#include <windows.h>
#pragma comment(lib,"winmm.lib")
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int main()
{
int loop=0;
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while (++loop)
{
cout<<loop<<endl;
Sleep(5000);
}
return 0;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
PlaySound("C:\\Windows\\Media\\Windows XP 關機.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
return 0;
}
❹ VC怎樣創建多線程
創建線程回調好書(使用_stdcall調用協議,及一個參數void * p),再使用createthread創建線程。
❺ VC多線程是什麼意思
通俗點說就是你老闆讓你把山上的樹做成板材
你一看,工作量大,於是你派出的兄弟們(這就是多線程)一起上
大家一起,有的砍樹,有的搬運,有的做板材,(即不同的線程一起工作,完成任務)一起完成任務。
❻ VC2005 開發一個多線程的應用程序(並發的資料庫訪問)
對於你的程序,我覺得可以由以下幾種改進方法:
1、進程的管理方式可以通過製作一個進程池統一管理(進程池的例子網上不少,搜一下就有)
2、針對資料庫的訪問是連接多個不同的資料庫還是一個?就你說的1分鍾完成訪問5-6次的話,感覺你的資料庫執行效率並不是很高,因此建議你改進一下SQL,如果可以用存儲過程的話,用存儲過程,甚至都可以考慮將很多個SQL拼成一個SQL串一次性執行,這樣可以減少資料庫的訪問次數
3、將需要或者固定下來的東西緩存下來,不要去查
4、盡量在執行一個資料庫操作後關閉連接,並釋放資源,因為資料庫的連接數是有限制的,並且會順序執行,如果你的操作沒有相應完,下一個就來的話,只能先等待上一個做完才可以
5、建議你將執行的存儲過程通過SQL的分析器,去計算一下時間,看看SQL是否可以優化
❼ vc++中什麼時候會用到多線程為什麼要用它
如果是涉及到界面或者是mfc程序,一邊在繪制界面,一邊自己程序運行,同時還要處理windows的消息機制,這就是多線程。
另外,如果像socket通信,http請求也都是多線程,如果大量數據需要分塊同時計算,也需要多線程。
❽ VC++ 最簡單的多線程
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI MyThread1(PVOID pvParam)
{
for(int a=0;a<10;a++)
{
cout<<"Thread1"<<endl;
Sleep(10000);
}
return 0;
}
DWORD WINAPI MyThread2(PVOID pvParam)
{
for(int b=0;b<3;b++)
{
cout<<"Thread2"<<endl;
Sleep(2000);
}
return 0;
}
DWORD WINAPI MyThread3(PVOID pvParam)
{
for(int c=0;c<7;c++)
{
cout<<"Thread3"<<endl;
Sleep(7000);
}
return 0;
}
int main()
{
HANDLE hThread1 = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, MyThread2, NULL, 0, NULL);
HANDLE hThread3 = CreateThread(NULL, 0, MyThread3, NULL, 0, NULL);
Sleep(5000);
cout<<"Main"<<endl;
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
return 0;
}
首先創建一個線程實用API CreateThread , 還有就是一個線程函數的原型.
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,
DWORD cbStack,
LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParam,
DWORD fdwCreate,
LPDWORD lpIDThread
);
DWORD WINAPI ThreadProc(
[in] LPVOID lpParameter
);
還有就是Sleep這個函數是放棄自己運行的時間片....
❾ VC多線程訪問資料庫的數據傳遞問題
說一些概念性的東西吧。
COM操作,它有一套自己關於跨線程和跨進程的模型,這是個復合模型,會衍生出大約7,8種組合。學習COM,這個是一定要吃透的。樓主閱讀一下關於CoInitializeEx函數的幫助文檔,能多多少少體會到一些。但如果沒學習過COM,光看MSDN的幫助文檔,如墜雲里霧里一般,很難理解的。因此,建議買本COM的書,稍微參閱一下,其次網上譬如CSDN中有很多熱心人寫的關於線程進程有關的COM模型,和使用規則,優缺點,可以拜讀一下!
在MFC中,可能不太會形成跨線程傳遞變數的危害性,這種觀念吧。所以,在MFC中,似乎我們能隨心所欲在線程之間傳遞變數,但其實是不對的,典型的就是主線程創建的窗口和控制項,最好不要在其它線程中直接操縱,而是通過線程間通信的方法,讓創建窗口和控制項的主線程來操縱窗口和控制項。
因此,變數是不能亂傳地,到了COM中,這個限制是非常明顯的,COM中有概念叫MARSHAL、PROXY、STUB,當然它主要是進程相關的概念,同樣說明了,非線程自己創建的東西,不是該線程使用就會有問題。
像VIEW這種界面的東西不要隨便亂傳給工作線程這種非界面線程。
我的建議是:
建工作線程,因為資料庫操作及從資料庫反饋到程序級的數據需要進行再加工,這些步驟都可能會非常耗時,耗時操作放在界面線程,會使界面線程無法處理WM_XXX的消息,造成界面假死。因此,像智能指針這種東西放到工作線程里進行獨立管理,工作線程通過智能指針向資料庫要數據,然後處理,存放數據結果到程序中約定的地方,如全局變數,虛擬內存等地方。數據處理完,通過自定義消息,向界面線程發送自定義消息,使界面線程能夠在自定義消息中,將保存的數據顯示到界面中,發送線程消息有個函數就是PostThreadMessage。
其他的細微細節也可以考慮,到底是創建自己的線程,還是使用線程池等。隨著經驗的豐富,會考慮很多問題的,關鍵是理論知識要學,實踐也不能沒有。
最後就是概念修正, _ConnectionPtr它是一個標準的C++類,C++類可以重載->操作符,這個被重載的指針操作符,使得通過該類實例化的變數在實際使用時,行為更像是一個指針,而不是個普通變數,這個被重載的指針操作符才是智能指針,而不是指_ConnectionPtr類是智能指針,頂多說它是個智能指針類,我也見過有翻譯成靈巧指針的,英文原版是SMART POINTER。
❿ C++多線程和VC++多線程一樣么
是一樣的! VC是一個環境 他有自己的MFC庫,但MFC庫就是用C++ 實現的…… 之所以這么問 估計是你還不太熟悉VC
如果一定要有區別的話:那麼單獨的C++去實現多線程,那麼就只能使用系統的API。而vc環境下則不一定,可以使用MFC的相關函數來實現,同樣也可以使用系統API