Advertisement

C++中多线程的创建、挂起、执行和销毁

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
本文详细介绍了在C++编程语言中实现多线程的方法,包括如何创建、暂停(挂起)、运行及终止线程。通过实例分析帮助读者掌握线程操作技巧。 1. 创建一个基于对话框的应用程序,并增加如图所示的控件:分别为三个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中设定这三个进度条的范围;为编辑框关联一个整型变量;为十二个按钮添加消息处理函数。 2. 定义结构体,用于线程函数参数传递: ```c typedef struct Threadinfo { CProgressCtrl *progress; // 进度条对象指针 int speed; // 速度值 int pos; // 当前位置 } thread, *lpthread; ``` 3. 在对话框中增加三个句柄,用于标识各个线程: ```c HANDLE hThread1; // 线程1的句柄 HANDLE hThread2; // 线程2的句柄 HANDLE hThread3; // 线程3的句柄 // 并增加三个结构体类型的变量,用于传递线程函数参数: thread thread1; thread thread2; thread thread3; ``` 4. 新增一个静态全局变量,用以记录所有线程的状态: ```c static int GlobalVar = 10000; // 初始化为10000 ``` 5. 声明并实现线程函数。注意只能有一个参数,并且返回值类型固定;可以自定义函数名。 ```c++ DWORD WINAPI ThreadFun(LPVOID pthread) { lpthread temp = (lpthread)pthread; temp->progress->SetPos(temp->pos); while (temp->pos < 20) { Sleep(temp->speed); // 设置速度 ++(temp->pos); // 增加进度 temp->progress->SetPos(temp->pos); // 更新进度条位置 GlobalVar--; if (temp->pos == 20) temp->pos = 0; } return true; } ``` 6. 在启动按钮的处理函数中编写如下代码: ```c++ thread1.progress = &m_progress1; // 关联进度条 thread1.speed = 100; // 设置速度值为100 hThread1 = CreateThread(NULL, 0, ThreadFun, (LPVOID)&thread1, 0, NULL); if (!hThread1) { MessageBox(创建线程失败); } ``` 7. 在挂起按钮的处理函数中编写如下代码: ```c++ if(SuspendThread(hThread1)==-1) { MessageBox(挂起失败!进程可能已经死亡或未创建!); return; } ``` 8. 在执行按钮的处理函数中编写如下代码: ```c++ if(ResumeThread(hThread1) == -1) { MessageBox(恢复线程失败!进程可能已经死亡或未创建!); return ; } ``` 9. 在停止按钮的处理函数中编写如下代码: ```c++ if(TerminateThread(hThread1,0)) { CloseHandle(hThread1); } else { MessageBox(终止线程失败!); } ``` 10. 为应用程序添加WM_TIMER消息,用于实时更新全局变量值到编辑框。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • C++线
    优质
    本文详细介绍了在C++编程语言中实现多线程的方法,包括如何创建、暂停(挂起)、运行及终止线程。通过实例分析帮助读者掌握线程操作技巧。 1. 创建一个基于对话框的应用程序,并增加如图所示的控件:分别为三个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中设定这三个进度条的范围;为编辑框关联一个整型变量;为十二个按钮添加消息处理函数。 2. 定义结构体,用于线程函数参数传递: ```c typedef struct Threadinfo { CProgressCtrl *progress; // 进度条对象指针 int speed; // 速度值 int pos; // 当前位置 } thread, *lpthread; ``` 3. 在对话框中增加三个句柄,用于标识各个线程: ```c HANDLE hThread1; // 线程1的句柄 HANDLE hThread2; // 线程2的句柄 HANDLE hThread3; // 线程3的句柄 // 并增加三个结构体类型的变量,用于传递线程函数参数: thread thread1; thread thread2; thread thread3; ``` 4. 新增一个静态全局变量,用以记录所有线程的状态: ```c static int GlobalVar = 10000; // 初始化为10000 ``` 5. 声明并实现线程函数。注意只能有一个参数,并且返回值类型固定;可以自定义函数名。 ```c++ DWORD WINAPI ThreadFun(LPVOID pthread) { lpthread temp = (lpthread)pthread; temp->progress->SetPos(temp->pos); while (temp->pos < 20) { Sleep(temp->speed); // 设置速度 ++(temp->pos); // 增加进度 temp->progress->SetPos(temp->pos); // 更新进度条位置 GlobalVar--; if (temp->pos == 20) temp->pos = 0; } return true; } ``` 6. 在启动按钮的处理函数中编写如下代码: ```c++ thread1.progress = &m_progress1; // 关联进度条 thread1.speed = 100; // 设置速度值为100 hThread1 = CreateThread(NULL, 0, ThreadFun, (LPVOID)&thread1, 0, NULL); if (!hThread1) { MessageBox(创建线程失败); } ``` 7. 在挂起按钮的处理函数中编写如下代码: ```c++ if(SuspendThread(hThread1)==-1) { MessageBox(挂起失败!进程可能已经死亡或未创建!); return; } ``` 8. 在执行按钮的处理函数中编写如下代码: ```c++ if(ResumeThread(hThread1) == -1) { MessageBox(恢复线程失败!进程可能已经死亡或未创建!); return ; } ``` 9. 在停止按钮的处理函数中编写如下代码: ```c++ if(TerminateThread(hThread1,0)) { CloseHandle(hThread1); } else { MessageBox(终止线程失败!); } ``` 10. 为应用程序添加WM_TIMER消息,用于实时更新全局变量值到编辑框。
  • C# 线与异步
    优质
    本课程深入讲解C#中的多线程和异步编程技术,帮助开发者掌握高效的并发处理方法,提升应用程序性能。 使用委托事件可以模拟多线程下载网络图片,即同时发送多个网络请求来下载图片。这种方法也可以应用于其他异步多线程执行的场景中。
  • Java线A线等待BC线完毕后再实例
    优质
    本实例演示了如何在Java多线程编程中实现一个主线程(A)需等待两个子线程(B和C)完全结束后,才继续运行的技术方案。 在一次面试中被问到一个问题:有B、C两个线程分别执行各自的任务,A线程需要等待B和C线程都完成后才开始运行,并且不能让A线程通过循环检查来空耗CPU资源。
  • 双向链表、插入、删除等功能
    优质
    本段落详细介绍如何在数据结构中实现双向链表的基本操作,包括其初始化、节点添加与移除以及内存释放等关键步骤。 以下是关于双向链表的创建、插入、删除及销毁操作的一个代码示例(包括详细的注释),适合初学者理解并使用,已经通过测试。 ```c #include #include // 定义双向链表节点结构体 typedef struct Node { int data; // 存储的数据 struct Node *prev; // 指向前面的指针 struct Node *next; // 指向后面的指针 } node; // 函数声明 node* createNode(int value); // 创建一个新节点并初始化数据值。 void insert(node **head, int data); // 在链表头部插入一个新的元素。 void delete_node(node **head, int key); // 根据给定的键删除节点。 void destroyList(node *head); // 销毁整个双向链表。 int main() { node* head = NULL; // 初始化头指针为NULL insert(&head, 5); insert(&head, 10); printf(Before deletion: ); printList(head); delete_node(&head, 10); // 删除值为10的节点 printf(\nAfter deletion: ); printList(head); destroyList(head); // 销毁链表 return 0; } // 创建一个新节点 node* createNode(int value) { node *new_node = (node*)malloc(sizeof(node)); // 分配内存给新的节点 if(new_node == NULL) { // 检查分配是否成功 printf(Memory allocation failed.\n); exit(0); } new_node->data = value; // 初始化数据值 new_node->prev = NULL; new_node->next = NULL; return new_node; } // 在链表头部插入一个新的元素 void insert(node **head, int data) { node *newNode = createNode(data); // 创建新的节点 newNode->next = (*head); // 将新节点的下一个指针指向当前头结点 if ((*head) != NULL) (*head)->prev = newNode; // 如果链表非空,将原头结点的前一个指针指向新节点 (*head) = newNode; } // 根据给定的键删除节点 void delete_node(node **head, int key) { node *temp = *head; if (temp != NULL && temp->data == key) // 如果要删除的是头结点,直接更新头指针,并释放内存。 (*head) = temp->next; while(temp != NULL && temp->data != key) // 找到给定键的节点 temp = temp->next; if (temp == NULL) return; // 如果找不到该键,直接返回 if (temp->prev != NULL) temp->prev->next = temp->next; // 更新前一个元素指向当前元素的下一个指针 if (temp->next != NULL) temp->next->prev = temp->prev; // 更新后一个元素指向当前元素的前一个指针 free(temp); // 释放被删除节点所占内存 } // 打印链表中的所有值 void printList(node *head) { node* curr_node = head; while(curr_node != NULL){ printf(%d , curr_node->data); curr_node = curr_node->next; // 移动到下一个节点 } } // 销毁整个双向链表的函数实现,释放所有内存。 void destroyList(node *head) { node* current = head; while (current != NULL){ node* nextNode = current->next; free(current); current = nextNode; // 移动到下一个节点 } } ``` 这个代码示例详细地展示了如何操作双向链表,包括创建、插入、删除和销毁等基本功能。同时包含必要的注释帮助初学者更好地理解每个步骤的功能与实现方式。
  • HttpSessionListener监控session以实现在线用户计数
    优质
    简介:通过监听HTTP会话的变化来动态统计网站的在线活跃用户数量,此方法利用了HttpSessionListener接口中定义的session创建和销毁事件。 当用户登录时,系统会调用LoginServlet,并将用户名添加到application的在线用户列表中。在用户退出时,则通过LogoutServlet来执行session.invalidate()操作,并由HttpSessionListener的sessionDestroyed()方法负责从在线列表中移除该用户的记录。同样地,在session过期的情况下,也会自动触发相同的机制:调用session.invalidate()并让HttpSessionListener的sessionDestroyed()方法将用户移出在线列表。
  • 使用_beginthreadex进线
    优质
    本文章详细介绍如何在Windows编程中利用_beginthreadex函数来创建和管理多线程,并探讨其优势与应用场景。 使用_beginthreadex创建多线程,并模拟五个个体共同协作完成一个任务。采用齐头并进的方式进行编程。这里提供了一些关于如何有效利用_beginthreadex编程的建议。
  • C#使用线等待界面
    优质
    本文章介绍了在C#编程语言环境下,如何运用多线程技术来实现应用程序运行时显示等待界面的功能。通过展示具体实例和代码解析,帮助开发者掌握这一关键技能,提升用户体验。 当程序处理耗时操作时,界面往往会卡住,给用户一种程序停止运行的错觉。为了改善用户体验,可以设计一个等待窗体来提示用户正在进行长时间的操作。由于主程序在忙于数据处理无法即时响应新的请求,因此建议使用一个新的线程专门负责显示这个等待窗体。
  • C++线实例详解: 线线切换
    优质
    本文详细介绍如何在C++中使用标准库进行多线程编程,涵盖线程的基本操作、创建方法以及多线程间的任务切换技巧。 对于C++初学者来说,一个简单的多线程例子可以帮助理解如何创建和使用线程。这样的示例通常会展示基本的线程操作,包括但不限于启动新线程、在线程间传递数据以及同步机制的基本应用。通过这些基础的例子,学习者可以逐步掌握更复杂的并发编程概念和技术。