MFC中多线程问题
问题是这样的:我们编程涉及到一个多线程问题,当把线程函数定义为全局时正常,而定义为类的成员函数时就会出错。说错误是AfxBeginThread不能从unsinged int (void *)转换为第一个参数。我在google上搜索了一下,找到了几个解决方案。
1.定义一个可直接在线程里调用类成员函数的类,并且网上也给出了类的实现。但我没有去研究,因为觉得这样不太方便,增加一个类,就会增加出错的机会。
2.将线程定义为static的。因为类的成员函数在调用时会首先传递个this指针,第一个参数就是this了,这也是如上直接使用成员函数失败的原因。但是又出现了新的问题:在定义为static时不能调用非静态的成员变量。我想到的解决办法是在用AfxBeginThread启动线程时第二个参数传为this,即类的指针,再在线程函数里用这个指针来调用成员函数和变量。
cpp 代码
- 1. class CRealtimeTask
- 2. {
- 3. public:
- 4. static UINT taskmain(LPVOID param);
- 5. BOOL StartTask();
- 6. void dosomething(){...}
- 7. };
- 8.
- 9. UINT CRealtimeTask ::taskmain(LPVOID param)
- 10. {
- 11. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
- 12.
- 13. pTaskMain->dosomething();
- 14. return TRUE;
- 15. }
- 16.
- 17. BOOL CRealtimeTask::StartTask()
- 18. {
- 19. AfxBeginThread(taskmain,this);
- 20. }
3.将线程定义为类的友元,如下所示:
cpp 代码
- class CRealtimeTask
- {
- public:
- friend UINT taskmain(LPVOID param);
- BOOL StartTask();
- };
-
- UINT taskmain(LPVOID param)
- {
- CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
-
- return TRUE;
- }
-
- BOOL CRealtimeTask::StartTask()
- {
- AfxBeginThread(taskmain,this);
- }
参考:
http://blog.chinaunix.net/u/21158/showart_298882.html
分享到:
相关推荐
在Microsoft Foundation Classes (MFC) 中,多线程是一个强大的特性,它允许应用程序同时执行多个独立的任务,提高程序的响应性和效率。本文将详细介绍如何在MFC中创建、挂起和结束线程,以及相关操作。 一、创建...
在Windows编程环境中,MFC(Microsoft Foundation Classes)库提供了一种高效的方式来构建用户界面和应用程序。...通过不断学习和实践,你可以更好地掌握MFC多线程和定时器的运用,提升你的Windows应用开发技能。
多线程是MFC中的一个重要特性,它允许程序同时执行多个不同的任务,提高程序的效率和响应性。本篇文章将深入探讨如何在MFC中创建多线程,特别是工作者线程,并且会针对`AfxBeginThread`和`BeginThread`两种方法进行...
5. 多线程中的数据同步:如何使用锁和同步对象保护共享资源。 6. 错误处理和调试:在多线程环境中定位和修复问题的策略。 要充分利用这个框架,你需要深入理解上述每个方面,并根据自己的项目需求进行适当的调整和...
### MFC多线程的创建详解 #### 一、MFC多线程概述 MFC (Microsoft Foundation Classes) 是微软为简化Windows程序开发提供的一套类库,它封装了Win32 API,使得开发者能够更加方便地进行Windows应用程序的开发。在...
当涉及到多线程(Multithreading)时,MFC GDI多线程绘图是一种技术,允许程序在不同的线程中同时进行图形绘制,提高应用性能和响应速度。 在MFC中,多线程的实现主要是通过`CWinThread`类来完成的。每个线程都由一...
在Windows平台上进行应用程序开发时,Microsoft Foundation Class (MFC) 库提供了一种方便的方式来实现多线程编程。MFC是Microsoft为C++开发者设计的一个类库,它封装了Windows API,使得创建复杂的Windows应用程序...
2. **线程同步**: 在多线程环境中,线程间的数据交换可能需要同步机制,如CSingleLock、CMultiLock或CRITICAL_SECTION等,防止数据竞争问题。 3. **线程通信**: 可以使用消息队列或者事件对象(如CEvent)来实现线程...
【MFC多线程编程】是Windows环境下使用Microsoft ...总结,MFC多线程编程使开发者能轻松地在Windows环境中实现并发处理,提升程序性能,但同时也需要注意线程管理、同步和资源竞争等问题,以确保程序的稳定性和效率。
标题 "基于MFC和多线程的UDP收发程序" 提及了几个关键技术和概念,它们在现代软件开发,特别是Windows应用开发中占有重要地位。本文将深入探讨这些技术及其在程序中的应用。 首先,MFC(Microsoft Foundation ...
MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步
5. **消息泵与消息队列**: 在MFC多线程中,每个线程都拥有自己的消息队列和消息泵。主线程通常负责UI更新,而工作线程则处理后台任务。线程间通信可以通过发送消息或使用其他同步机制进行。 6. **线程同步**: 使用...
在MFC中实现多线程功能,可以让你的应用程序同时执行多个任务,例如在游戏或多媒体应用中播放背景音乐,而不会阻塞用户界面的其他操作。本篇文章将深入探讨如何使用MFC来实现一个多线程背景音乐播放的实例。 首先,...
本示例代码“MFC多线程开发例程源码1”是针对MFC库进行多线程编程的一个实践案例,旨在帮助开发者理解如何在MFC应用中创建和管理多个执行线程。 首先,我们要明白什么是多线程。多线程是一种程序设计模型,允许应用...
总的来说,MFC-TCP.rar是一个关于使用MFC进行TCP通信的实例,涵盖了多线程服务器设计、客户端连接处理、异步I/O操作以及线程间通信等多个关键点。对于想要深入理解和实践MFC和TCP通信的开发者来说,这是一个非常有...
一、MFC多线程基础 MFC通过CWinThread类支持多线程。每个线程都是一个独立的执行路径,拥有自己的堆栈和上下文。CWinThread是所有MFC线程的基类,负责线程的创建、调度和管理。创建新线程时,通常需要继承CWinThread...
总结来说,VS2013的MFC多线程多串口编程涉及了Windows API的使用,通过多线程实现串口通信的并发处理,确保多个串口可以同时工作且互不干扰。这在需要处理大量串口数据或连接多个设备的应用场景中尤其重要,比如工业...
4. **同步问题**: 由于多线程环境中的数据访问可能引发竞态条件,所以在处理接收到的数据时,确保使用适当的同步机制,如临界区(CriticalSection)、互斥量(Mutex)或事件(Event)来保护共享资源,防止数据不一致。...
在多线程环境中,异常可能在任何线程中抛出,因此应确保所有线程都有适当的异常处理机制,并且在异常发生时能够正确释放资源。 总之,MFC的多线程功能为开发者提供了创建和管理线程的便利工具。理解并熟练运用这些...