怎么在基于对话框的MFC程序中实现多线程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在基于对话框的MFC程序中实现多线程?相关的知识,希望对你有一定的参考价值。

怎么设计基于对话框的多线程程序?比如,基于对话框的MFC程序可以通过按钮来调用函数,现在我想直接开多线程来处理一些数据,并且不影响原有按钮的触发功能,怎么实现?记时器和多线程试例最好,望高手前辈指点! 

参考技术A 1. 因为你是MFC程序,建议使用AfxBeginThread()来创建新线程。AfxBeginThread()的内部会做一些相应的初始化,再调用CreateThread()API。 线程处理函数也就是一个普通的函数,但是其声明形式有规定的,如下:
DWORD WINAPI ThreadProc (LPVOID pParam);
线程函数的名字由你自己定,但是格式必须是什么这个声明形式。比如:
DWORD WINAPI MyThreadFunction (LPVOID pParam)

// 函数体,这里你写你的处理代码。
// 只是在理解上,要注意的是,这个线程函数体里面的代码是
// 在新的线程中运行。虽然在源代码上,这里面的代码和其他的代码
// 存在于同一个文件中


“可是要在程序运行的才创建的线程,要怎么处理呢”--》不明白你的这个子问题的意思。
新的线程都是在程序运行起来之后,由相应的创建函数创建的。没有哪个线程是在编译时创建的啊。

2. 同一个线程处理函数的代码可以被多个线程共享的。可就是说,你可以只定义一个线程函数。不同的线程创建起来后,运行相同的代码。可以通过传递不同的参数(这个参数可以在创建新线程时从外面传递进去),来让线程函数体内的代码有不同的运行逻辑。
DWORD WINAPI MyThreadFunction (LPVOID pParam /*线程的参数*/)

int nMyParam = (int)pParam;
if ( 0 == nMyParam )
else if ( 1 == nMyParam )
else if (...)

对于线程函数的参数,它是LPVOID,但是你在外面可以给他传递一个整形,或者指针,然后在线程函数体内强制转型回来使用。真正使用什么数据类型,与你自己控制。

在理解上,也要注意理解多个线程运行同一份代码的意思。
如果多个线程的线程函数读写同一个全局变量或者访问同一个资源,就需要做同步控制。使用临界区,Mutex等同步对象来控制。

对于多线程的运行机制的理解,比较重要。
理解了之后,你才能游刃有余地控制它。要不然,很容易带来问题。

以上是关于怎么在基于对话框的MFC程序中实现多线程?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中实现多线程以更新外部函数可访问的内部字典

Java中实现多线程的两种方式之间的区别

2在NET中实现多线程

Java中实现多线程的两种方式

VB中的多线程

JAVA中实现多线程的四种方式