:6.582KB : :1 :2019-12-24 08:32:26
1,扩展线程的正常退出方式。
2,指派线程CPU核心。
3,定时信息框的运用。
4,获取系统CPU核心数。
5,自动推荐使用线程数量。
.子程序 _按钮_开始工作_被单击
.局部变量 n, 整数型
.局部变量 i, 整数型
.局部变量 CpuIndex, 整数型
.局部变量 hThread, 整数型
.局部变量 OldMask, 整数型
.局部变量 Text, 文本型, , , 提示文本
.局部变量 Error, 文本型
连续赋值 (真, 按钮_开始工作.禁止, 按钮_停止工作.禁止) ' 防止误操作
置等待鼠标 ()
n = 到整数 (编辑框_工作线程.内容) ' 读取需要创建的线程数量
.如果真 (n < 1)
信息框 (“工作线程数量不能小于1”, #信息图标, “提示”, _启动窗口)
处理事件 ()
连续赋值 (假, 按钮_开始工作.禁止, 按钮_停止工作.禁止)
返回 ()
.如果真结束
m_WorkState = 0 ' 设置线程运行状态
m_StopNum = 0 ' 计数置零
CpuIndex = 0 ' CPU序号从0开始
重定义数组 (m_Threads, 假, n) ' 清除原来的线程句柄
.计次循环首 (n, i)
hThread = CreateThread (0, 0, &执行子程序, i, 0, 0) ' 创建工作线程,并传递线程编号作为参数。
.如果真 (hThread = 0)
m_WorkState = 1 ' 通知已运行的线程退出。
n = 0 ' 跳出循环后解除按钮的禁止状态。
Error = “创建第” + 到文本 (i) + “条线程失败!” ' 先设置好错误信息,最后再弹出提示。
跳出循环 ()
.如果真结束
m_Threads [i] = hThread ' 保存线程句柄
OldMask = SetThreadAffinityMask (hThread, 左移 (1, CpuIndex)) ' 用1来左移,指定CPU掩码,这里只允许在一个CPU上运行,如果要允许在多个CPU上运行,那么就把对应的二进制位设置为1。
.如果真 (OldMask = 0)
m_WorkState = 1 ' 通知已运行的线程退出。
n = 0 ' 跳出循环后解除按钮的禁止状态。
Error = “设置第” + 到文本 (i) + “条线程的CPU掩码失败!” ' 先设置好错误信息,最后再弹出提示。
跳出循环 ()
.如果真结束
Text = “第” + 到文本 (i) + “条线程开始工作,运行在第” + 到文本 (CpuIndex + 1) + “个CPU。”
编辑框_提示信息.加入文本 (Text + #换行符)
CpuIndex = CpuIndex + 1
.如果真 (CpuIndex ≥ m_CpuNum) ' CPU序号是从0开始的,所以必须小于CPU数目。
CpuIndex = 0
.如果真结束
.计次循环尾 ()
处理事件 ()
恢复鼠标 ()
.如果真 (取文本长度 (Error) > 0)
信息框 (Error, #信息图标, “提示”, _启动窗口)
.如果真结束
.判断开始 (n > 0)
按钮_停止工作.禁止 = 假
.默认
连续赋值 (假, 按钮_开始工作.禁止, 按钮_停止工作.禁止)
.判断结束
.子程序 执行子程序, 整数型
.参数 Index, 整数型, , 线程索引
.局部变量 int, 整数型
.判断循环首 (m_WorkState ≠ 1) ' 判断是否继续工作,这个变量虽然是程序集变量,但是在线程中只读它的值是不会引发崩溃的。
int = int + 1
.如果真 (int > 999999) ' 防止加到无限大时计算溢出。
int = 0
.如果真结束
.判断循环尾 ()
标签1.调用反馈事件 (1, Index, 假) ' 通知窗口主线程关闭线程句柄
' CoUninitialize () ' 如果线程开始运行后有初始化COM库,那么在线程退出前调用API来卸载COM库。
返回 (1)
02-18多线程快速生成指定数据
02-17会员管理插件源码
02-17Sk文本转图片[支持多线程快速生成]
02-16动态创建菜单与响应事件源码,菜单编辑器
02-16鱼刺多线程5.4分离程序集:线程池Ex
02-09画板快捷启动3.2源码修改版
09-07C++的string的实现源码分析