VC++关于MFC多线程

VC++关于MFC多线程,第1张

AfxBeginThread(Proc1,hWnd,0)在调用之前必须先申明,你可以在它之前加这样一句话:UINT Proc1(LPVOID param);(函数体外申明)

void CChat::DoDataExchange(CDataExchange pDX)这个是作为数据映射处理的,不能将函数放在此处。你可以把前面两句放在初始化函数调用

用多线程就解决了:假设你调用的复杂方法是void fun(int a, int b);那么你可以添加如下代码:

struct tagMyParam

{

int a;

int b;

}MYPARAM;

DWORD WINAPI CaclProc( LPVOID lpParameter)

{

MYPARAM Param = (Param)lpParameter;

fun(Param->a, Param->b);

return 0;

}

在你的主函数里如下写:

PARAM Param;

int a = 12, b = 20;

Parama = a;

Paramb = b;

CreateThread(NULL, 0, CaclProc, &Param, 0, NULL);

CreateThread函数可以用来创建一个线程,在MSDN中查找这个函数得到如下信息:"The CreateThread function creates a thread to execute within the address space of the calling process"和"If the function succeeds, the return value is a handle to the new thread"所以我们得定义一个句柄用来存放它的返回值。还定义一个指向线程ID的DWORD值dwThreadId。然后我们就可以用CreateThread函数来创建我们的线程了,CreateThread函数有六个参数分别是

LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes

DWORD dwStackSize, // initial thread stack size

LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function

LPVOID lpParameter, // argument for new thread

DWORD dwCreationFlags, // creation flags

LPDWORD lpThreadId // pointer to receive thread ID

其中第一个参数我们设置为NULL,使这个句柄不能被继承;第二个参数设置为0,使用默认的堆栈大小;第三个参数为线程函数的起始地址,也就是线程函数的函数名;第四个参数为NULL,没有值要传递给线程函数;第五个参数为0,创建好之后马上让线程运行;第六个参数设置为指向线程ID的地址。创建好线程之后,线程函数进行初始化之类的 *** 作,主函数继续执行,此时可以输出被创建线程的ID。我们在主函数中用WaitForSingleObject函数来等待线程函数变成受信(signaled)状态,它的两个参数分别是

HANDLE hHandle, // handle to object to wait for

DWORD dwMilliseconds // time-out interval in milliseconds

第一参数为线程函数的句柄,第二个参数设置为INFINITE,等待线程一直执行完。在程序的最后还要记得用CloseHandle函数关闭线程,这样主函数就写完了。

在线程函数里面我们可以简单地做一些工作,比如设置一个循环,让它输出一定的信息等。源程序如下:

#include <windowsh>

#include <iostreamh>

DWORD WINAPI ThreadFunc(HANDLE Thread)

{

int i;

for(i=0;i<10;i++)

{

cout<<"A new thread has created!"<<endl;

}

return 0;

}

int main(int argc,char argv[])

{

HANDLE Thread;

DWORD dwThreadId;

Thread=::CreateThread

(NULL,0,ThreadFunc,NULL,0,&dwThreadId);

cout<<"The new thread ID is :"<<dwThreadId<<endl;

::WaitForSingleObject(Thread,INFINITE);

::CloseHandle(Thread);

return 0;

}

在Window xp sp2&VC++ 60环境下编译通过。

#include <windowsh>

#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++关于MFC多线程全部的内容,包括:VC++关于MFC多线程、VC用户界面线程、如何在VC中利用系统函数创建一个新的线程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9625399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存