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