当前位置:首页 » 编程软件 » 多线程编程mfc

多线程编程mfc

发布时间: 2022-05-08 02:08:48

㈠ MFC多线程

我就比较喜欢用多线程, 最简单的想法就是效率高, 比如, 我们只用一个主线程在一个程序里, 每一个时刻都在做一件事情; 而如果我们开辟了多个线程的话, 就可以在同一时刻做多件事情而互不干扰, 各自完成各自的工作。
多线程就好比多任务的操作系统, 同一时刻我们既可以听音乐又可以上网, 而单线程就好比单任务的, 我们需要听完音乐再去上网, 这样花费的时间久很多了。
再比如说, 你的程序里需要不断的更新某项数据, 那你就可以为它开辟一个线程, 让它无限循环着每隔一段时间就在后台进行一次更新操作, 而主线程仍跟用户不间断的交互着, 线程是不是很方便呢?
我是这么理解的。

线程还有个地方是比较通用的, 比如我们的程序中, 有个功能的实现比较耗时, 比如读取庞大的数据库中的信息,并对数据进行计算等操作, 这个耗时比较大, 那么我们就要给它开辟一个线程, 让它在后台进行, 主线程正跟用户做着其他事情的时候, 这个线程便悄悄从后台对数据进行了处理了, 这样用户就不必干等着了,感觉不到你程序运行的慢了; 一般超过5秒的等待时间都要为它开辟一个线程。

就说这么多了~~

㈡ MFC多线程编程

可能是执行的过快造成的吧。
建议如下:
1. 定义两个信号量CEvent,初始化为非信号;
2. 在AfxBeginThread()创建线程后,加入短暂的休眠Sleep()函数让线程有机会初始化。
3. 在Sleep函数后用WaitForSingleObject等待对应线程的准备就绪信号量置位
4. 在线程执行体内,准备就绪后,添加置位对应的信号量的语句。

这样通过检测信号量可以使得两个线程都准备就绪,然后再开始通信。
另外,请注意线程中循环体内的休眠时间,理应比通信速度要快,才能有效检测。其实最好的方法就是通过信号量等对象来控制多线程间的异步时序关系。

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

基于MFC的对话框程序加启动进度条(转)
对于比较大的程序,在启动的时候都会显示一个画面,以告诉用户程序正在加载,或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop等。
这些启动画面在Visual C++中怎么实现呢?对于文档/视图结构的程序,可以直接使用VC提供的SplashWnd组件。可是在基于对话框的程序却不能使用SplashWnd组件。因此只能自己来实现此功能。
因为显示启动画面的同时还要进行程序的加载工作,所以要用到多线程。MFC区分了两种不同类型的多线程:用户界面(UI)线程和工作者线程。两者的区别是UI线程有消息循环,而工作者线程没有,UI线程能够创建窗口并处理发送给窗口的消息。工作者线程用来执行后台任务,这些后台任务不直接接受用户输入,因此不需要窗口和消息循环。 因为这里要显示一个画面,所以要使用UI线程。

下面结合我做的一个小软件“实用闹钟”来说明如何为对话框程序制作启动画面。
打开Visual C++建立一个对话框工程Page.
首先准备一副位图资源插入到工程中,作为启动时显示的画面。再插入一个对话框,设置ID为IDD_SPLASH。在上面放一个picture控件,类型设为”Bitmap”,图象选择刚才插入的位图。
设置对话框的Style为Popup,Border 为None,去掉Title Bar属性,并调整对话框的大小与位图等大,这样对话框显示的时候,你看到的只是图片。打开 ClassWizard为此对话框建立一个新类CSplashDlg, 基类为CDialog.
UI线程是由一个动态可创建的类来控制,该类是从CWinThread派生的,非常类似从CWinApp派生的一个应用程序类.打开ClassWizard建立一个由CWinThread派生的类----CSplashThread,在SplashThread.h 中加入 #include"SplashDlg.h",并添加一个protected型指针变量:
CSplashDlg* m_pSplashDlg; //声明一个对话框指针

下面我们将在UI线程的InitInstance()函数中调用刚才创建的对话框并显示。
BOOL CSplashThread::InitInstance()
{
::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE );
//:通常系统内的每个线程都有自己的输入队列。本函数允许线程和进程共享输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 . (这个函数可以不用)
m_pSplashDlg=new CSplashDlg;
m_pSplashDlg->SetEnable(true);
m_pSplashDlg->Create(IDD_SPLASH);
m_pSplashDlg->ShowWindow(SW_SHOW);
return true;
}

为CSplashThread类添加一个函数HideSplash(), 用来隐藏启动画面(即关闭对话框)
void CSplashThread::HideSplash()
{
m_pSplashDlg->SendMessage(WM_CLOSE);
}

在ExitInstance()中释放资源:
int CSplashThread::ExitInstance()
{
m_pSplashDlg->DestroyWindow();
delete m_pSplashDlg;
return CWinThread::ExitInstance();
}

在应用程序类CPageApp中包含头文件: #include “SplashThread.h”
并添加两个变量:
public: //设为pulic类型,是为了在其他类中能够访问
CSplashThread* pSplashThread;
CSplashDlg* m_pSplashDlg;

在InitInstance()中启动UI线程:
pSplashThread = (CSplashThread*) AfxBeginThread(
RUNTIME_CLASS(CSplashThread),
THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED);
ASSERT(pSplashThread->IsKindOf(RUNTIME_CLASS(CSplashThread)));
pSplashThread->ResumeThread();
Sleep(1);

为了让程序一起动就显示启动画面,这段代码应该放在InitInstance()最开头的地方.
启动画面是显示了,可是结束代码应该放在什么地方呢?如果放在InitInstance()的CPageDlg dlg; m_pMainWnd = &dlg; 后面,即在构造了主对话框之后隐藏启动画面, 程序运行时会发现,启动画面结束后,还要等一会才能显示出主对话框,这样就达不到启动画面应有的效果. 最好应该在即将显示主对话框的时候隐藏启动画面. 我的这个软件中在主对话框中定义了5个子对话框类的对象,分别是page1,page2,…page5.
程序启动时的流程如下:
Page1构造 --->Page2构造 --->Page3构造---> Page4构造---> Page5构造---> 主对话框构造 --->主对话框初始化---> Page1初始化---> Page2初始化 --->Page3初始化 Page4初始化---> Page5初始化
由此可见,启动画面结束的最好地方应该是在 page5的初始化函数中
BOOL CPage5::OnInitDialog()
{
CDialog::OnInitDialog();
if ( ((CPageApp*)AfxGetApp())->pSplashThread != NULL)
((CPageApp*)AfxGetApp())->pSplashThread->HideSplash();
return TRUE;
}
到此,一个对话框程序的启动画面就这样完成了.由于是用对话框作为启动画面,所以你可以你可以发挥你的想象力,在对话框上设计出丰富多才的效果来,比如加上Flash,Gif动画等.

㈣ mfc创建线程的三种方法

MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务

1、WIN的API函数CreateThread

HANDLE CreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, // SD
DWORDdwStackSize, // initial stack size
LPTHREAD_START_ROUTINElpStartAddress, // thread function
LPVOIDlpParameter, // thread argument
DWORDdwCreationFlags, // creation option
LPDWORDlpThreadId // thread identifier
);
//lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。

dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。

lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:

DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。

lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。

dwCreationFlags :线程标志,可取值如下

(1)CREATE_SUSPENDED-----创建一个挂起的线程,

(2)0---------------------------------表示创建后立即激活。

lpThreadId:保存新线程的id。

2、MFC的全局函数AfxBeginThread

CWinThread* AfxBeginThread( AFX_THREADPROCpfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );

//用于创建工作者线程 其中pfnThreadProc指向线程函数 pParam为传递给线程函数的参数

CWinThread* AfxBeginThread( CRuntimeClass*pThreadClass, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs= NULL );

//用于创建用户界面线程 其中pThreadClass为CWinThread派生对象的RUNTIME_CLASS

3、MFC的CWinThread类的CreateThreat成员函数

BOOL CreateThread( DWORD dwCreateFlags = 0, UINT nStackSize = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

//CWinThread类支持工作者线程和用户界面线程 可以将一个CWinThread派生类的CRUNTIMECLASS的指针作为参数传递给AfxBeginThread函数以创建一个用户界面线程 CWinThread类的CreateThread成员函数创建一个调用进程的地址空间中执行的线程

VC 6.0 创建线程的三种方法

CreateThread/ExitThread
_beginthreadex/_endthreadex
AfxBeginThread /AfxEndThread

对以上三种方式的选择:

1.在使用了MFC的程序中使用AfxBeginThread函数或者CWinThread::CreateThread函数创建线程。

2.在非MFC工程中,如果要创建多线程,建议使用_beginthreadex

3.避免使用CreateThread函数。不使用_beginthread.

4.线程内部退出函数使用与创建函数配套的函数。

㈤ 求大神指导MFC多线程编程。进度条那种就行。我按照网上的例子运行出来

我用的BOOST库中的线程库
void CTestBoost::OnBnClickedBtntestboost()
{
// TODO: 在此添加控件通知处理程序代码
UINT length = 500;
m_wndProgress.SetRange(0, length);
m_wndProgress.SetStep(1);
m_wndProgress.SetPos(0);
boost::thread t(boost::bind(&CTestBoost::RunTest, this, length));
t.detach();//将子线程和主线程分离,子线程执行完成后自己释放资源
}

void CTestBoost::RunTest(UINT length)
{
for(size_t i=0;i<length;i++)
{
m_wndProgress.SetPos(i);
Sleep(2);
}
MessageBox(_T("完成"),_T("提示"),MB_ICONINFORMATION);
GetDlgItem(IDC_BTNTESTBOOST)->EnableWindow(TRUE);
runState=0;
}

㈥ MFC多线程编程里有MAIN函数吗MFC程序就是多线程吗MFC和多线程的关系是什么

  1. 子线程没有main函数入口的说法,但在部分工程模式下,允许命名子线程函数为main

  2. MFC程序本身不是多线程

  3. 任何win32下的C++程序都支持用户自定义多线程,MFC也不例外,就是这个关系。

㈦ MFC中的多线程如何实现。和单线程有啥区别

Windows是对线程进行调度,而使用多线程可以实现程序的实时多任务,但同时也增加了程序的复杂性,即要求线程进行同步。
实现线程只需要AfxBeginThread即可

㈧ MFC编程多线程程序设计

就是线程在Sleep(2000)后,就挂起2秒钟,于是就进入了等待队列!在2秒后被唤醒,进入CPU的就绪队列,这样,只要时间片办到这个线程,它就执行!

㈨ MFC多线程编程,如何向辅助UI线程中添加控件消息响应函数

我不知道你说的辅助UI线程,是否是通过AfxBeginThread创建的CWinThread线程。关于消息响应的问题,不知道你是否按照MFC的要求,建立了必要的类,重载了必要的函数。

但我更想说,你这种做法实在太复杂,完全可以在一个线程中完成的事情,何必放在两个线程里!!只要简单地在主窗口对话框中,创建一个定时器,就完全可以实现你需要的功能。

热点内容
怎么压缩邮件 发布:2025-05-14 04:16:51 浏览:496
云服务器搭建邮箱绑定郁闷 发布:2025-05-14 04:16:48 浏览:148
crc校验c语言算法 发布:2025-05-14 04:15:15 浏览:44
curl静态编译 发布:2025-05-14 04:09:52 浏览:159
压缩久期 发布:2025-05-14 04:08:46 浏览:941
sql置疑 发布:2025-05-14 04:07:09 浏览:441
java面试的算法题 发布:2025-05-14 04:06:18 浏览:467
交叉编译优化 发布:2025-05-14 03:48:52 浏览:532
动图在线压缩 发布:2025-05-14 03:35:24 浏览:133
w7共享无法访问 发布:2025-05-14 03:35:24 浏览:483