多线程编程(Context)

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992343.html

通过切换线程的Context内容,使用单线程模拟多线程运行。在程序中需要使用到的API主要有以下这些:

GetThreadContext(HANDLE hThread, Context lpContext);

说明:GetThreadContext,将hThread的上下文保存到lpContext中

SetThreadContext(HANDLE hThread, const Context *lpContext);

说明:SetThreadContext,将lpContext的内容保存到hThread的上下文中。

[cpp] view plain copy

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #define SEND_THREAD_ID  1
  4. #define RECV_THREAD_ID  2
  5. const UINT uiTimerID = 10;
  6. HANDLE mainhandle;
  7. CONTEXT send_context;
  8. CONTEXT recv_context;
  9. HANDLE hd_send_thread;
  10. HANDLE hd_recv_thread;
  11. //如果hd_send_thread运行, thread_id = 1;
  12. //如果hd_recv_thread运行, thread_id = 2;
  13. int cur_thread_id = 0;
  14. void send_thread_func()
  15. {
  16. static int send_msg_count = 0;
  17. while(1)
  18. {
  19. printf("send_msg_count:............................ %d\n", send_msg_count++);
  20. Sleep(1000);
  21. }
  22. }
  23. void recv_thread_func()
  24. {
  25. static int recv_msg_count = 0;
  26. while(1)
  27. {
  28. printf("recv_msg_count: --------------------%d\n", recv_msg_count++);
  29. Sleep(1000);
  30. }
  31. }
  32. VOID CALLBACK TimerFun(HWND hwnd, UINT a, UINT b, DWORD c)
  33. {
  34. static int nCount = 0;
  35. printf("TimerFun nCount: %d\n", nCount++);
  36. if(nCount == 0)
  37. {
  38. send_context.ContextFlags = CONTEXT_FULL;
  39. recv_context.ContextFlags = CONTEXT_FULL;
  40. GetThreadContext(mainhandle, &send_context); //保存主线程上下文
  41. GetThreadContext(mainhandle, &recv_context); //保存主线程上下文
  42. return;
  43. }
  44. if(nCount % 2 == 1) //启动hd_send_thread
  45. {
  46. if(cur_thread_id != SEND_THREAD_ID)
  47. {
  48. SuspendThread(mainhandle);      //中止主线程的运行,模拟中断产生.但没有保存寄存器
  49. recv_context.ContextFlags = CONTEXT_FULL;
  50. GetThreadContext(mainhandle, &recv_context); //保存主线程上下文
  51. SetThreadContext(mainhandle, &send_context); //得到主线程上下文,为切换任务做准备
  52. cur_thread_id = SEND_THREAD_ID;
  53. ResumeThread(mainhandle);
  54. }
  55. }
  56. else  //启动hd_recv_thread
  57. {
  58. if(cur_thread_id != RECV_THREAD_ID)
  59. {
  60. SuspendThread(mainhandle);      //中止主线程的运行,模拟中断产生.但没有保存寄存器
  61. send_context.ContextFlags = CONTEXT_FULL;
  62. GetThreadContext(mainhandle, &send_context); //保存主线程上下文
  63. SetThreadContext(mainhandle, &recv_context); //得到主线程上下文,为切换任务做准备
  64. cur_thread_id = RECV_THREAD_ID;
  65. ResumeThread(mainhandle);
  66. }
  67. }
  68. }
  69. int main()
  70. {
  71. MSG msg;
  72. SetTimer(NULL, uiTimerID, 1000, TimerFun);
  73. hd_send_thread = CreateThread(NULL,
  74. 0,
  75. (LPTHREAD_START_ROUTINE)send_thread_func,
  76. 0,
  77. 0,
  78. 0);
  79. SuspendThread(hd_send_thread);
  80. hd_recv_thread = CreateThread(NULL,
  81. 0,
  82. (LPTHREAD_START_ROUTINE)recv_thread_func,
  83. 0,
  84. 0,
  85. 0);
  86. SuspendThread(hd_recv_thread);
  87. DuplicateHandle(GetCurrentProcess(),
  88. hd_send_thread,
  89. GetCurrentProcess(),
  90. &mainhandle,
  91. 0,
  92. TRUE,
  93. 2);
  94. cur_thread_id = SEND_THREAD_ID;
  95. ResumeThread(hd_send_thread);
  96. ResumeThread(hd_recv_thread);
  97. while(GetMessage(&msg, NULL, 0, 0))
  98. {
  99. TranslateMessage(&msg);
  100. DispatchMessage(&msg);
  101. }
  102. return   0;
  103. }

不知道为什么在main函数中,就将hd_send_thread、hd_recv_thread两个线程的上下文保存到send_context、recv_context中,然后再到定时器中断中进行切换就会出错,所以将这部分的代码也放在第一次进定时器中断的时候运行。

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992343.html

时间: 2024-10-14 10:04:43

多线程编程(Context)的相关文章

Android多线程编程(一)——多线程基础

什么是进程 一个进程是一个独立(self contained)的运行环境,它可以看作一个程序或者一个应用. 什么是线程 而线程是进程中执行的一个任务,Java运行环境是一个包含了不同累和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. Android线程 Android的线程,实际上和Java的多线程编程并没有什么本质上的不同.当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

java多线程编程

一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指

C++11多线程编程之互斥量

+(UIImage*)createImageFromView:(UIView*)view { //obtain scale CGFloat scale = [UIScreen mainScreen].scale; 开始绘图,下面方法,第一个参数表示区域大小.第二个参数表示是否是非透明的.如果需要显示半透明效果,需要传NO,否则传YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.wi

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等.但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage). 一

Java中的 多线程编程

Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另

不再为Core Data多线程编程而头疼

by Saul Mora原文链接:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/ 我知道我曾经提到我要写一篇关于定制fetch requests的文章,然而,在我为Active Record Fetching project(现在已经改名为MagicalRecord)编写了一些代码之后,我觉得写一篇关于fetching–threading.的文章更好一些. 当大多数cocoa开发者提到Core

Java多线程编程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

C++ 多线程编程总结

一.什么是多线程? 在计算机编程中,一个基本的概念就是同时对多个任务加以控制.许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程.可以通过多种途径达到这个目的.最开始的时候,那些掌握机器低级语言的程序员编写一些"中断服务例程",主进程的暂停是通过硬件级的中断实现的.尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题.中断对那些实时性很强的任务来说是很有必要的.但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序