mfc多线程

Error C1189: #error: Please use the /MD switch for _AFXDLL builds

半城伤御伤魂 提交于 2020-03-16 08:16:32
在VS 2013中编译程序时出现错误: 错误提示1: error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] 原因 : 常规里面是:在静态库中使用MFC,或使用标准Windows库,此时该处可能无论是什么都会报错 运行库中多线程调试是:MDd(多线程调试DLL) 解决方法 : 将MDd改成MTd,如果改正后报错误2,按下面方法更改。 错误提示2: error C1189: #error: Please use the /MD switch for _AFXDLL builds 原因 : 常规里面是:在共享DLL中使用MFC, 运行库中多线程调试是:MTd(多线程调试) 解决方法 : 将常规改成:在静态库中使用MFC,或使用标准Windows库 常规和运行库 如下图: 常规: 右击项目->属性->配置属性->常规,然后在右边的“项目默认值”中的“MFC的使用”选项中选择“在静态库中使用MFC”, 多线程调试: 右击项目-->属性->配置属性->c/c++->代码生成->运行时库->多线程调试(/MTd) 相关注释: MFC的使用

MFC 生成可执行的exe

青春壹個敷衍的年華 提交于 2020-01-19 00:02:39
1.工程右键选择属性: 2.【配置(C)】选择<Release>,【配置属性】-》【常规】-》【项目默认值】-》【MFC的使用】选择<在静态库中使用MFC>: 3.【配置属性】-》【C/C++】-》【代码生成】-》【运行库】选择<多线程(/MT)>: 4.点击应用,再点击确定: 5.解决方案配置选择Release: 6.生成解决方案,然后再工程文件夹的Release目录下会有生成的可执行的exe。 来源: CSDN 作者: 火柴棍mcu 链接: https://blog.csdn.net/professionalmcu/article/details/104028014

MFC多线程技术

天涯浪子 提交于 2019-12-26 23:38:20
MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没笑消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程之外的用户输入,响应用户及系统产生的事件和消息等。但对于Win32的API编程而言,这两种编程是没有区别的,他们都只需要线程的启动地址即可启动线程来执行任务。 在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。这两种函数的重载和原型分别说明如下: (1)工作者线程 CWndThread *AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, UINT nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL); (2)IU线程(用户界面线程) CWndThread *AfxBeginThread(CRuntimeClass *pThreadClass, int

VC error link

ぃ、小莉子 提交于 2019-12-24 03:54:26
错误1: LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 在project-setting-link里找到project options 去掉里面的/subsystem:console 错误2: nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endt... 将工程设置为Using MFC in a static library 错误3: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 在project-setting-link里找到project options 将里面的/subsystem:console 改为/subsystem:windows 错误4: nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex 错误5:

MFC总结

淺唱寂寞╮ 提交于 2019-12-07 10:47:19
1.MFC 消息 只有继承CCmdTarget的类才能实现消息映射。 消息映射应该首先在类里面使用 DECLARE_MESSAGE_MAP(), 然后再类的实现文件里使用 BEGIN_MESSAGE_MAP(theClass, baseClass) END_MESSAGE_MAP() 现在看看怎样实现消息映射的 (注意不同版本的vs实现的上面的宏可能会有微小的差异) : DECLARE_MESSAGE_MAP()为这个类引入了函数 GetMessageMap()的声明; BEGIN_MESSAGE_MAP 给这个类引入了 _messageEntries 数组(也被称为消息映射数组),也实现了GetMessageMap() . END_MESSAGE_MAP() 作为 数组_messageEntries 的结束标志。 _messageEntries数组的每一项存储的内容是 消息ID和这个消息的处理函数 。 GetMessageMap() 得到的是一个struct,它的内容是 基类的GetMessageMap()函数的地址 和 自己的_messageEntries数组的地址。 这样当一个消息来到的时候,如果在自己的 消息映射数组(既是_messageEntries) 里面没有找到这个消息处理函数,那么就会调用GetMessageMap() 间接得到父类的消息映射数组(

MFC 多线程总结

半腔热情 提交于 2019-12-07 10:46:58
(一) MFC对多线程编程的支持   MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。    工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外 的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来 执行任务。   在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下: (1) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0, DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL); PfnThreadProc:指向工作者线程的执行函数的指针,线程函数原型必须声明如下: UINT

VS2017编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

匆匆过客 提交于 2019-12-05 02:29:57
VS2017编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version 先选择“解决方案管理器”, 然后按如下路径: 项目-》属性-》C/C++-》代码生成-》运行库, 将“多线程调试DLL(/MDd)”改成“多线程(/MT)”或“多线程调试(/MTd)”。 来源: https://www.cnblogs.com/ming-4/p/11897927.html

C++/MFC中多线程使用

不想你离开。 提交于 2019-11-30 19:24:16
一。创建线程的三种方式 1.CreateThread (windows中vc++) CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程属性 _In_ SIZE_T dwStackSize, //栈空间大小 _In_ LPTHREAD_START_ROUTINE lpStartAddress, //线程执行函数地址 _In_opt_ __drv_aliasesMem LPVOID lpParameter, //传递参数 _In_ DWORD dwCreationFlags, //标志,可以选择挂起 _Out_opt_ LPDWORD lpThreadId //线程id ); 1 DWORD WINAPI ThreadProc(LPVOID lpParameter) 2 { 3 int a = (int)lpParameter; 4 CString str; 5 str.Format(_T("%d"),a); 6 AfxMessageBox(str); 7 return 0; 8 } 9 void CSegDlg::OnBnClickedstop() 10 { 11 // TODO: 在此添加控件通知处理程序代码 12 DWORD dwThreadId = 0; //线程id 13 HANDLE

MFC多线程编程之四——线程的同步

柔情痞子 提交于 2019-11-30 04:18:01
八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种: 临界区(CCriticalSection) 事件(CEvent) 互斥量(CMutex) 信号量(CSemaphore) 通过这些类,我们可以比较容易地做到线程同步。 A、使用 CCriticalSection 类 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 定义CCriticalSection类的一个全局对象

MFC常用函数总结

佐手、 提交于 2019-11-28 18:16:56
1、MFC编辑框、静态文本框相关的常用函数 《1》GetDlgItemText(ID ,str) 作用:从对话框中获取文本 第一个参数为要获取的编辑框(或者静态文本框、单选按钮等可以显示内容的控件)的ID,第二个参数为字符串(Cstring 类型)的变量,获取的文本存储在str中。 《2》SetDlgItemText(ID,str) 作用:将字符串显示在控件中 第一个参数为要显示的编辑框(或者静态文本框、单选按钮、组合框等可以显示内容的控件)的ID,第二个参数为字符串(Cstring 类型)的变量,显示的文本存储在str中。如果要显示的变量的类型不是Cstring,则通过Format函数强制转换。 通常还要加一个UpDateData(FALSE)。 《3》UINT nID=GetCheckedRadioButton(IDC1, IDC2); 作用:获取单选框的选项的ID 第一个参数为该组合框中第一个单选按钮的ID,第二个参数为该组合框中最后一个按钮的ID。 《4》CheckRadioButton(IDC1, IDC2, IDC3); 作用:初始化单选按钮 第一个参数为该组合框中第一个单选按钮的ID,第二个参数为该组合框中最后一个按钮的ID,第三个参数为为缺省选项的ID。 《5》m_scrollBar.SetScrollRange(0, 500) ; 作用:设置水平滚动条的取值范围