`

MFC中多线程问题

    博客分类:
  • vc
阅读更多
MFC中多线程问题

问题是这样的:我们编程涉及到一个多线程问题,当把线程函数定义为全局时正常,而定义为类的成员函数时就会出错。说错误是AfxBeginThread不能从unsinged int (void *)转换为第一个参数。我在google上搜索了一下,找到了几个解决方案。
1.定义一个可直接在线程里调用类成员函数的类,并且网上也给出了类的实现。但我没有去研究,因为觉得这样不太方便,增加一个类,就会增加出错的机会。

2.将线程定义为static的。因为类的成员函数在调用时会首先传递个this指针,第一个参数就是this了,这也是如上直接使用成员函数失败的原因。但是又出现了新的问题:在定义为static时不能调用非静态的成员变量。我想到的解决办法是在用AfxBeginThread启动线程时第二个参数传为this,即类的指针,再在线程函数里用这个指针来调用成员函数和变量。
cpp 代码
  1. 1. class CRealtimeTask
  2. 2. {
  3. 3. public:
  4. 4. static UINT taskmain(LPVOID param);
  5. 5. BOOL StartTask();
  6. 6. void dosomething(){...}
  7. 7. };
  8. 8.
  9. 9. UINT CRealtimeTask ::taskmain(LPVOID param)
  10. 10. {
  11. 11. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
  12. 12. //通过pTaskMain指针引用。
  13. 13. pTaskMain->dosomething();
  14. 14. return TRUE;
  15. 15. }
  16. 16.
  17. 17. BOOL CRealtimeTask::StartTask()
  18. 18. {
  19. 19. AfxBeginThread(taskmain,this);
  20. 20. }

3.将线程定义为类的友元,如下所示:
cpp 代码
  1. class CRealtimeTask
  2. {
  3. public:
  4. friend UINT taskmain(LPVOID param);
  5. BOOL StartTask();
  6. };
  7. UINT taskmain(LPVOID param)
  8. {
  9. CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
  10. //通过pTaskMain指针引用。
  11. return TRUE;
  12. }
  13. BOOL CRealtimeTask::StartTask()
  14. {
  15. AfxBeginThread(taskmain,this);
  16. }
参考:http://blog.chinaunix.net/u/21158/showart_298882.html
分享到:
评论

相关推荐

    mfc中多线程的简单使用

    在Microsoft Foundation Classes (MFC) 中,多线程是一个强大的特性,它允许应用程序同时执行多个独立的任务,提高程序的响应性和效率。本文将详细介绍如何在MFC中创建、挂起和结束线程,以及相关操作。 一、创建...

    MFC中利用多线程实现定时器

    在Windows编程环境中,MFC(Microsoft Foundation Classes)库提供了一种高效的方式来构建用户界面和应用程序。...通过不断学习和实践,你可以更好地掌握MFC多线程和定时器的运用,提升你的Windows应用开发技能。

    MFC创建多线程(工作者线程)demo

    多线程是MFC中的一个重要特性,它允许程序同时执行多个不同的任务,提高程序的效率和响应性。本篇文章将深入探讨如何在MFC中创建多线程,特别是工作者线程,并且会针对`AfxBeginThread`和`BeginThread`两种方法进行...

    MFC Opengl多线程框架

    5. 多线程中的数据同步:如何使用锁和同步对象保护共享资源。 6. 错误处理和调试:在多线程环境中定位和修复问题的策略。 要充分利用这个框架,你需要深入理解上述每个方面,并根据自己的项目需求进行适当的调整和...

    MFC多线程的创建,包括工作线程和用户界面线程

    ### MFC多线程的创建详解 #### 一、MFC多线程概述 MFC (Microsoft Foundation Classes) 是微软为简化Windows程序开发提供的一套类库,它封装了Win32 API,使得开发者能够更加方便地进行Windows应用程序的开发。在...

    MFC GDI多线程绘图

    当涉及到多线程(Multithreading)时,MFC GDI多线程绘图是一种技术,允许程序在不同的线程中同时进行图形绘制,提高应用性能和响应速度。 在MFC中,多线程的实现主要是通过`CWinThread`类来完成的。每个线程都由一...

    利用MFC进行多线程编程

    在Windows平台上进行应用程序开发时,Microsoft Foundation Class (MFC) 库提供了一种方便的方式来实现多线程编程。MFC是Microsoft为C++开发者设计的一个类库,它封装了Windows API,使得创建复杂的Windows应用程序...

    基于MFC开发的多线程串口通信上位机

    2. **线程同步**: 在多线程环境中,线程间的数据交换可能需要同步机制,如CSingleLock、CMultiLock或CRITICAL_SECTION等,防止数据竞争问题。 3. **线程通信**: 可以使用消息队列或者事件对象(如CEvent)来实现线程...

    MFC多线程编程

    【MFC多线程编程】是Windows环境下使用Microsoft ...总结,MFC多线程编程使开发者能轻松地在Windows环境中实现并发处理,提升程序性能,但同时也需要注意线程管理、同步和资源竞争等问题,以确保程序的稳定性和效率。

    基于MFC和多线程的udp收发程序

    标题 "基于MFC和多线程的UDP收发程序" 提及了几个关键技术和概念,它们在现代软件开发,特别是Windows应用开发中占有重要地位。本文将深入探讨这些技术及其在程序中的应用。 首先,MFC(Microsoft Foundation ...

    MFC 多线程及线程同步

    MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步

    MFC多线程例子

    5. **消息泵与消息队列**: 在MFC多线程中,每个线程都拥有自己的消息队列和消息泵。主线程通常负责UI更新,而工作线程则处理后台任务。线程间通信可以通过发送消息或使用其他同步机制进行。 6. **线程同步**: 使用...

    MFC实例多线程实现背景音乐播放

    在MFC中实现多线程功能,可以让你的应用程序同时执行多个任务,例如在游戏或多媒体应用中播放背景音乐,而不会阻塞用户界面的其他操作。本篇文章将深入探讨如何使用MFC来实现一个多线程背景音乐播放的实例。 首先,...

    MFC多线程开发例程源码1

    本示例代码“MFC多线程开发例程源码1”是针对MFC库进行多线程编程的一个实践案例,旨在帮助开发者理解如何在MFC应用中创建和管理多个执行线程。 首先,我们要明白什么是多线程。多线程是一种程序设计模型,允许应用...

    MFC-TCP.rar_TCP通信_TCP通信MFC_mfc tcp 多线程_mfc tcp通信_mfc 多线程

    总的来说,MFC-TCP.rar是一个关于使用MFC进行TCP通信的实例,涵盖了多线程服务器设计、客户端连接处理、异步I/O操作以及线程间通信等多个关键点。对于想要深入理解和实践MFC和TCP通信的开发者来说,这是一个非常有...

    MFC多线程 工作者线程 用户界面线程

    一、MFC多线程基础 MFC通过CWinThread类支持多线程。每个线程都是一个独立的执行路径,拥有自己的堆栈和上下文。CWinThread是所有MFC线程的基类,负责线程的创建、调度和管理。创建新线程时,通常需要继承CWinThread...

    VS2013写的MFC多线程多串口编程,多串口可同时工作

    总结来说,VS2013的MFC多线程多串口编程涉及了Windows API的使用,通过多线程实现串口通信的并发处理,确保多个串口可以同时工作且互不干扰。这在需要处理大量串口数据或连接多个设备的应用场景中尤其重要,比如工业...

    MFC 多线程之间通过消息传递数据

    4. **同步问题**: 由于多线程环境中的数据访问可能引发竞态条件,所以在处理接收到的数据时,确保使用适当的同步机制,如临界区(CriticalSection)、互斥量(Mutex)或事件(Event)来保护共享资源,防止数据不一致。...

    基于c/c++的MFC的多线程

    在多线程环境中,异常可能在任何线程中抛出,因此应确保所有线程都有适当的异常处理机制,并且在异常发生时能够正确释放资源。 总之,MFC的多线程功能为开发者提供了创建和管理线程的便利工具。理解并熟练运用这些...

Global site tag (gtag.js) - Google Analytics