mfc-MFC多线程的挂起与启动问题

问题描述

MFC多线程的挂起与启动问题

小弟在MFC多文档下编写的多线程编码,想运行OnThreadResume() 这个函数线程挂起,OnThreadSuspend()开始线程,但为什么调用了OnThreadResume()函数,在调用OnThreadSuspend() 会报错呢,线程的句柄是NULL呢?求解答啊
UINT CDrawView::DrawLine(LPVOID pParam)

PARAM m_pParam=(PARAM)pParam;
CBrush m_Brush;
CWnd m_Wnd;
CDC m_Dc;
//根据线程ID产生对应颜色的画刷
if(m_pParam->m_nID==0)
{
m_Brush.CreateSolidBrush(RGB(255,0,0));
}else if(m_pParam->m_nID==1){
m_Brush.CreateSolidBrush(RGB(0,255,0));
}else{
m_Brush.CreateSolidBrush(RGB(0,0,255));
}
//根据窗口句柄,得到CDC
m_Wnd.Attach(m_pParam->m_hWnd);
m_Dc=m_Wnd.GetDC();
CBrush *m_pOldBrush=(CBrush
)m_Dc->SelectObject(&m_Brush);

//重复画矩形,每次前进一个像素
for(int i=1;i<300;i++)
    {
        m_Dc->Rectangle(10,35+m_pParam->m_nID*50,10+i,55+m_pParam->m_nID*50);
        Sleep(100);//让线程暂停100ms,是为了可以明显的看到三个线程是同时执行的
    }
    //(至少我的肉眼看来是这样的,实际并非如此)
m_Dc->SelectObject(m_pOldBrush);
m_Wnd.Detach();
return 0;


void CDrawView::OnThreadResume()
{
// TODO: Add your command handler code here
CString szContent = "确定要开启线程?";
PARAM *m_pParam[THREAD_NUM]={NULL,NULL,NULL};//传入线种入口函数的参数,初始化为空
CWinThread *m_pThread[THREAD_NUM];
for(int i=0;i<THREAD_NUM;i++){

    m_pThread[i]=NULL;
    m_pParam[i]=new PARAM;
    memset((void*)m_pParam[i],0,sizeof(PARAM));//将为入口函数参数分配
    //的内存全部置0值
    //写入线程ID和窗口句柄
    m_pParam[i]->m_nID=i;
    m_pParam[i]->m_hWnd=GetSafeHwnd();

    //启动线程
    //if(IDYES == MessageBox(szContent,NULL,MB_YESNO))
        m_pThread[i]=AfxBeginThread(DrawLine,(LPVOID)(m_pParam[i]),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
        ASSERT(m_pThread[i]);
        m_pThread[i]->m_bAutoDelete = FALSE;
        //m_pThread[i]->ResumeThread();
        //Sleep(10000);
}

}

void CDrawView::OnThreadSuspend()
{
// TODO: Add your command handler code here

for (int i = 0; i < THREAD_NUM; i ++)
{
    if (m_pThread[i] == NULL)
    {
        AfxMessageBox("错误");
    }
    m_pThread[i]->ResumeThread();
}

}

解决方案

你在主线程中的挂起和恢复关你线程里的什么事情,根本不是一码事。

时间: 2024-10-10 10:37:57

mfc-MFC多线程的挂起与启动问题的相关文章

MFC关于多线程计算脏数据的问题

问题描述 MFC关于多线程计算脏数据的问题 请问多线程运算为什么会出现脏数据,脏数据造成运算结果不稳定怎么避免和预防? 解决方案 所谓脏数据,就是一个线程修改了这个数据的副本,另一个线程持有的副本并没有更新,还是原来的数据,所以叫脏数据. 解决方案二: 数据没有加锁,被多个线程同时修改等.

求mfc中多线程中通过CLIST传值的用法。。

问题描述 求mfc中多线程中通过CLIST传值的用法.. 自己在编一个mfc多线程程序. 如T1想把数据放到一个队列中 T2从这个队列中读取数据,处理数据后把数据保存到队列2中 T3再从队列2中读取数据使用 求帮忙,想实现这个功能是创建队列好还是用clist好.最好有代码实例.谢谢

关于MFC调多线程,线程锁定的原理

问题描述 关于MFC调多线程,线程锁定的原理 如果调用的全局变量的数组都是独立的,按理说不锁定也不会冲突啊,为什么运算结果不稳定?系统锁定到底是做了什么? 解决方案 http://www.cnblogs.com/wxfasdic/archive/2010/09/23/1833522.html 解决方案二: MFC 多线程参数传递

MFC通过多线程并发复制数组,关于数组下标的选择?

问题描述 MFC通过多线程并发复制数组,关于数组下标的选择? 从文件读取数组,所以数组大小是不确定的,这种情况下关于MFC数组下标范围的选择应该怎么做? 解决方案 大小不固定可以使用new动态分配内存,不建议使用链表,那样效率低. 解决方案二: 用CArray等 先获取数组大小 然后遍历 解决方案三: 可以用链表,也可以借助STL啊,比如vector

深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)

1.创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数.该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程. 工作者线程 CWinThread *AfxBeginThread( AFX_THREADPROC pfnThreadProc, //控制函数 LPVOID pParam, //传递给控制函数的参数 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级 UINT nStackSize =

&lt;转&gt;关于MFC的多线程类 CSemaphore,CMutex,CCriticalSection,CEvent

---------------------------------------------------线程---------------------------------------------------- CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) listen,NULL,0,&IDThread); 参数1 : 按MSDN上的说法,为空时handle不可以被继承. 参数2 : 栈的大小, 为0时取默认值. 参数3 : 线程函数指针, 上面的li

新手学JAVA(十)-多线程----线程的创建和启动

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例.每个下次你哼的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).Java使用线程执行体来代表这段程序流     在Java线程的创建有三种方式      通过继承Thread类创建线程类 步骤如下 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务.因此把run()方法称为线程执行体. 创建Thread子类的实例,即创建了线程的对象.

详解Java多线程编程中线程的启动、中断或终止操作_java

线程启动: 1.start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用. run() : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public void run(){ ... } }; MyThread mythread = new

Java 并发/多线程教程(七)-创建和启动java线程

      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 创建和启动线程 在java中创建一个线程如下: Thread thread = new Thread(); 调用方法start()来启动一个线程: thread.start();         这个例子没有指定线程执行任何代码,线程将会在启动之后停止.         有两种方式指定线程应该执行什么代码.第一种方式就是创建一个Thread的子类并覆写run()方法.第