CWinThread*  m_pthread; //多线程对象

struct param//参数传递结构体
{
int id;
TASK t[20];
};

CNB400Dlg::CNB400Dlg(CWnd* pParent /*=NULL*/)//构造函数
: CDialogEx(CNB400Dlg::IDD, pParent)
, m_time(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pthread = NULL;

}

CNB400Dlg::~CNB400Dlg()//析构函数
{
if (m_pthread)
{
DWORD exit;
GetExitCodeThread(m_pthread->m_hThread, &exit);
TerminateThread(m_pthread->m_hThread, exit);
}

}

主线程中启动:

param * pA = new param;

pA->t[count].TID = tid;
pA->t[count].SID = FindSid(i, j);

// m_dati->PName
CString pro;
pro.Format(m_dati->PName);

pA->t[count].TProName = pro;

pA->t[count].RID1 = FRid1(pro);
pA->t[count].RID2 = FRid2(pro);

pA->t[count].Snum = FSnum(pro);
pA->t[count].Rnum1 = FRnum1(pro);
pA->t[count].Rnum2 = FRnum2(pro);

pA->t[count].status = S_M2;
pA->t[count].type = T_BIC;
pA->t[count].dilute = 0;
pA->t[count].dilutenum = 0;

pA->t[count].emg = Findemg(i, j);

pA->t[count].data.primaryempty = 0;
pA->t[count].data.secondaryempty = 0;

count++;
tid++;

CWinThread* m_pthread = AfxBeginThread((AFX_THREADPROC)MyThreadProc, (LPVOID)pA, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
CWinThread* m_pthread1 = AfxBeginThread((AFX_THREADPROC)MyThreadPro1, NULL, THREAD_PRIORITY_NORMAL, 0, 0, NULL);

工作线程:

(1)在.h文件中的申明:

static UINT MyThreadProc(LPVOID pParam);

(2)在.CPP中的实现

UINT CNB400Dlg::MyThreadProc(LPVOID pParam)//不断获取申请的任务,启动测试
{

while (1)
{
Sleep(1000);//1ms为单位
if (count > 1)
{
m_mutex.Lock();
//获取主线程传递的参数值
for (int i = 1; i < count; i++)//count值比任务数多1
{
param* bt = (param*)pParam;

t[i].TID = (bt->t[i]).TID;
t[i].SID = (bt->t[i]).SID;
t[i].RID1 = (bt->t[i]).RID1;
t[i].RID2 = (bt->t[i]).RID2;
t[i].Snum = (bt->t[i]).Snum;
t[i].Rnum1 = (bt->t[i]).Rnum1;
t[i].Rnum2 = (bt->t[i]).Rnum2;
t[i].status = (bt->t[i]).status;
t[i].type = (bt->t[i]).type;
t[i].dilute = (bt->t[i]).dilute;
t[i].dilutenum = (bt->t[i]).dilutenum;
t[i].emg = (bt->t[i]).emg;
t[i].data.primaryempty = (bt->t[i]).data.primaryempty;
t[i].data.secondaryempty = (bt->t[i]).data.secondaryempty;

worker.NewTask(t[i]);

CString str, r1id;
//int->cstring
r1id.Format("%d", t[i].RID1);

str.Format("样本编号为\"%d\"的样本添加完成!", t[i].SID);
str = str + "\n" + "当前样本试剂R1编号为:" + r1id + "\n";
AfxMessageBox(str);

}

}

worker.SetSpeed(SPEED_1);
worker.StartWork();

STATUS status;
status = worker.GetStatus(t[1].TID);
CString ss;
ss.Format("1、样本初始申请状态在第 %d 阶段", (int)status);
AfxMessageBox(ss);
m_mutex.Unlock();
break;

}

return 0;
}

MFC 线程使用的更多相关文章

  1. MFC 线程创建方式

    MFC 分UI线程和工作线程,一般现在的应用程序都是一个主UI线程和N个工作线程来完成工作.主UI线程获取到工作线程发送的信息来刷新界面. 不过因为工作需要,MFC有要维护的项目,因此就学习一下MFC ...

  2. MFC 线程中CWnd对象

    尽量不要在MFC线程中将CWnd作为参数传递,会引起crash 正确的做法: 1. 将CWnd对应的handle传进来,通过CWnd::FromHandle()函数转换: 2. 在线程中用SendMe ...

  3. 安全终止MFC线程

    终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...

  4. MFC线程钩子和全局钩子[HOOK DLL]

    第一部分:API函数简介 1.       SetWindowsHookEx函数 函数原型 HHOOK SetWindowsHookEx( int idHook,        // hook typ ...

  5. MFC线程(三):线程同步事件(event)与互斥(mutex)

    前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...

  6. 多开 MFC线程

    序言:我才编程几年啊!就要处理多线程.对于只写函数的我,这难度简直了!不过MFC的多线程,貌似比较简单,还能处理的了. (1).开MFC多个线程 在视频采集的过程中,如果不使用媒体计数器,会造成主线程 ...

  7. Boost多线程-替换MFC线程

           Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞.在新线程里面载入大量流,会导致内存泄露. 方便之处:直接使用结构体传入函数参数,供 ...

  8. MFC线程(二):线程同步临界区CRITICAL SECTION

    当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...

  9. MFC 线程

    //新开一个线程去处理新的工作,可以传一个参数 class MyClass//自定义一个类 { void fun(){} ... } MyClass* myObject=new MyClass;Afx ...

随机推荐

  1. hdu 2177 取(2堆)石子游戏(威佐夫博奕)

    题目链接:hdu 2177 这题不是普通的 Nim 博弈,我想它应该是另一种博弈吧,于是便推 sg 函数打了个 20*20 的表来看,为了方便看一些,我用颜色作了标记,打表代码如下: #include ...

  2. Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)

    前言 理论知识:UFLDL教程.Deep learning:三十三(ICA模型).Deep learning:三十九(ICA模型练习) 实验环境:win7, matlab2015b,16G内存,2T机 ...

  3. Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)

    前言 理论知识:UFLDL教程和http://www.cnblogs.com/tornadomeet/archive/2013/04/09/3009830.html 实验环境:win7, matlab ...

  4. Java Performance - 如何调查解决 CPU 问题

    随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题:但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问 ...

  5. 渲染引擎之Camera

    Camera, 在游戏渲染引擎里面, 如果摄影师的眼睛, 它决定了观众可以看到的游戏内容.从3D技术角度讲,Camera就是如何计算视图矩阵view matrix的模块(这里不讨论透视的方法),无论是 ...

  6. css学习笔记 2

    css中的简写: 颜色的简写有三种:十六进制的形式.rgb(a).颜色名称. 单位的省略:当属性值为0px时,可以简写为0. margin和padding的简写,不多说了. border的简写:bor ...

  7. C/C++ 如何来自动优雅的涮别银家的贴子

    被涮屏涮烦了,就分享一下如何用低调的c/c++来涮别人家的屏吧! 此处埋下三颗雷! 这不是啥新知识,也不是什么浅显的代码.下面,来淘淘这份经验,呼呼 我们要了解Web browser 这个控件,因为到 ...

  8. BFC 神奇背后的原理

    BFC已经是一个耳听熟闻的词语了,网上有许多关于BFC的文章,介绍了如何触发BFC, 以及BFC的一些用处(如清浮动,防止margin重叠等).虽然我知道如何利用BFC解决这些问题,但当别人问我BFC ...

  9. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  10. Oracle 字符串分割排序冒泡算法

    例子: 一个字符串"11,15,13,17,12",以逗号分割,现在要排序成"11,12,13,15,17". 写了一个实现方法,记录下来以备后用: ----- ...