MFC 线程使用
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 线程使用的更多相关文章
- MFC 线程创建方式
MFC 分UI线程和工作线程,一般现在的应用程序都是一个主UI线程和N个工作线程来完成工作.主UI线程获取到工作线程发送的信息来刷新界面. 不过因为工作需要,MFC有要维护的项目,因此就学习一下MFC ...
- MFC 线程中CWnd对象
尽量不要在MFC线程中将CWnd作为参数传递,会引起crash 正确的做法: 1. 将CWnd对应的handle传进来,通过CWnd::FromHandle()函数转换: 2. 在线程中用SendMe ...
- 安全终止MFC线程
终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也要 ...
- MFC线程钩子和全局钩子[HOOK DLL]
第一部分:API函数简介 1. SetWindowsHookEx函数 函数原型 HHOOK SetWindowsHookEx( int idHook, // hook typ ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- 多开 MFC线程
序言:我才编程几年啊!就要处理多线程.对于只写函数的我,这难度简直了!不过MFC的多线程,貌似比较简单,还能处理的了. (1).开MFC多个线程 在视频采集的过程中,如果不使用媒体计数器,会造成主线程 ...
- Boost多线程-替换MFC线程
Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞.在新线程里面载入大量流,会导致内存泄露. 方便之处:直接使用结构体传入函数参数,供 ...
- MFC线程(二):线程同步临界区CRITICAL SECTION
当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...
- MFC 线程
//新开一个线程去处理新的工作,可以传一个参数 class MyClass//自定义一个类 { void fun(){} ... } MyClass* myObject=new MyClass;Afx ...
随机推荐
- hdu2296Ring(ac自动机+dp)
链接 dp[i][j]表示长度为i在节点J的时候的权值最大值,根据trie树转移一下就行,需要每次都取最小的,所以需要另开一数组保存字典序最小的状态. #include <iostream> ...
- hdu4511小明系列故事——女友的考验(ac自动机+最短路)
链接 预处理出来任意两点的距离,然后可以顺着trie树中的节点走,不能走到不合法的地方,另开一维表示走到了哪里,依次来更新. 注意判断一下起点是不是合法. #include <iostream& ...
- jQuery之元素操作及事件绑定
1.操作元素之属性: ①attr读:("selector").attr("属性名"):=>getAttribute("属性名"):改: ...
- eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结
eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表‘XXX’中的标识列插入显式值。
在创建事务复制时,很多时候不一定使用快照进行初始化,而是使用备份还原初始化.当对有标识列(即identity的自增列)的表进行复制的时候,使用备份还原初始化搭建起来的复制常常就会报错,即:当 IDEN ...
- 运行js提示库没有注册错误8002801d的解决办法
运行js提示库没有注册错误8002801d的解决办法这个错误主要是因为服务器上的windows scripts版本较低,请按下面的链接下载较高版本windows scripts 5.6并在服务器上进行 ...
- python核心编程第六章练习6-14
随机数.设计一个“石头.剪子.布”游戏,有时又叫“Rochambeau”,你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种:石头.剪子.布.胜利者从下面的规则产生, ...
- linux笔记:shell基础-bash基本功能
历史命令的调用: 命令和文件补全(如果当前有多个可选的补全,则按2次tab键,可以列出所有的可选项): 命令别名: 让别名永久生效: 删除别名: bash常用快捷键: 标准输入输出: 输出重定向: 输 ...
- Chinese culture
文房四宝 笔墨纸砚是中国古代文人书房中必备的宝贝,被称为“文房四宝”.用笔墨书写绘画在 中国可追溯到五千年前.秦(前221---前206)时已用不同硬度的毛和竹管制笔:汉代(前206—公元220) ...
- Qt工程转化为Vs工程
cmd中输入: qmake -tp vc XXX.pro 一般需要将qmake的路径配置到系统环境变量中去...