网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
VC中利用多线程技术实现线程之间的通信
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
数据给各个排序子线程
struct MySafeArray
{
 long* data;
 int iLength;
};

//打印每一个线程的排序结果
void PrintResult(long* Array, int iLength, const char* HeadStr = "sort");

//排序函数
unsigned long __stdcall BubbleSort(void* theArray); //冒泡排序
unsigned long __stdcall SelectSort(void* theArray); //选择排序
unsigned long __stdcall HeapSort(void* theArray); //堆排序
unsigned long __stdcall InsertSort(void* theArray); //插入排序
/*以上四个函数的声明必须适合作为一个线程函数的必要条件才可以使用CreateThread
建立一个线程。
(1)调用方法必须是__stdcall,即函数参数压栈顺序由右到左,而且由函数本身负责
栈的恢复, C和C++默认是__cdecl, 所以要显式声明是__stdcall
(2)返回值必须是unsigned long
(3)参数必须是一个32位值,如一个指针值或long类型
(4) 如果函数是类成员函数,必须声明为static函数,在CreateThread时函数指针有特殊的写法。如下(函数是类CThreadTest的成员函数中):
static unsigned long _stdcall MyThreadFun(void* pParam);
handleRet = CreateThread(NULL, 0, &CThreadTestDlg::MyThreadFun, NULL, 0, &ThreadID);
之所以要声明为static是由于,该函数必须要独立于对象实例来使用,即使没有声明实例也可以使用。*/

int QuickSort(long* Array, int iLow, int iHigh); //快速排序

int main(int argc, char* argv)
{
 long data = {123,34,546,754,34,74,3,56};
 int iDataLen = 8;
 //为了对各个子线程分别对原始数据进行排序和保存排序结果
 //分别分配内存对data数组的数据进行复制
 long *data1, *data2, *data3, *data4, *data5;
 MySafeArray StructData1, StructData2, StructData3, StructData4;
 data1 = new long[iDataLen];
 memcpy(data1, data, iDataLen << 2); //把data中的数据复制到data1中
 //内存复制 memcpy(目标内存指针, 源内存指针, 复制字节数), 因为long的长度
 //为4字节,所以复制的字节数为iDataLen << 2, 即等于iDataLen*4
 StructData1.data = data1;
 StructData1.iLength = iDataLen;
 data2 = new long[iDataLen];
 memcpy(data2, data, iDataLen << 2);
 StructData2.data = data2;
 StructData2.iLength = iDataLen;
 data3 = new long[iDataLen];
 memcpy(data3, data, iDataLen << 2);
 StructData3.data = data3;
 StructData3.iLength = iDataLen;
 data4 = new long[iDataLen];
 memcpy(data4, data, iDataLen << 2);
 StructData4.data = data4;
 StructData4.iLength = iDataLen;
 data5 = new long[iDataLen];
 memcpy(data5, data, iDataLen << 2);
 unsigned long TID1, TID2, TID3, TID4;
 //对信号量进行初始化
 evtTerminate = CreateEvent(NULL, FALSE, FALSE, "Terminate");
 evtPrint = CreateEvent(NULL, FALSE, TRUE, "PrintResult");
 //分别建立各个子线程
 CreateThread(NULL, 0, &BubbleSort, &StructData1, NULL, &TID1);
 CreateThread(NULL, 0, &SelectSort, &StructData2, NULL, &TID2);
 CreateThread(NULL, 0, &HeapSort, &StructData3, NULL, &TID3);
 CreateThread(NULL, 0, &InsertSort, &StructData4, NULL, &TID4);
 //在主线程中执行行快速排序,其他排序在子线程中执行
 QuickSort(data5, 0, iDataLen - 1);
 PrintResult(data5, iDataLen, "Quick Sort");
 WaitForSingleObject(evtTerminate, INFINITE); //等待所有的子线程结束
 //所有的子线程结束后,主线程才可以
  • 上一篇资讯: 利用OpenGL实现三维绘图
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号