import duties(Python import变量)

最近在读《编程之美》,打算用C#实现其中一个题目,就是如何控制CPU的使用率在50%,使得在资源管理器中CPU利用率维持在一条直线。单核的还容易办到,但是现在的机器一般都是多核的,这样就需要调用Win32API SetThreadAffinityMask 来给线程制定CPU去执行。但这个API只能在C++调用,那么在C#里如何调用呢?更进一步,就是在C#里为什么没有全部的WIN32API可

大家好,又见面了,我是你们的朋友全栈君。

最近在读《编程之美》,打算用C#实现其中一个题目,就是如何控制CPU的使用率在50%,使得在资源管理器中CPU利用率维持在一条直线。单核的还容易办到,但是现在的机器一般都是多核的,这样就需要调用Win32 API SetThreadAffinityMask 来给线程制定CPU去执行。但这个API只能在C++调用,那么在C#里如何调用呢?更进一步,就是在C#里为什么没有全部的WIN32 API可以调用呢?有没有方法可以实现呢?

读了一堆C#的帖子和GOOGLE了一通后,发现了原因。当框架小组构建他们的  .NET  部分时,他们评估了为使  .NET  程序员可以使用  Win32  而需要完成的工作,结果发现  Win32  API  集非常庞大。他们没有足够的资源为所有  Win32  API  编写托管接口、加以测试并编写文档,因此只能优先处理最重要的部分。许多常用操作都有托管接口,但是还有许多完整的  Win32  部分没有托管接口。 

那么用什么方法呢?平台调用  (P/Invoke)  是完成这一任务的最常用方法。要使用  P/Invoke,您可以编写一个描述如何调用函数的原型,然后运行时将使用此信息进行调用。其实就是用DllImport来声明属性和API,然后直接在C#里调用。

步骤是:

1)声明调用的API

[DllImport(“DllSample.dll”, CharSet = CharSet.Auto, SetLastError = true)]
static extern int SetProcessInfo( IntPtr id, UIntPtr cpu, ref int modify );
   

2)在C#里调用

int i, cpuCount, modify ;

IntPtr mask = new IntPtr(i);
UIntPtr cpu = new UIntPtr(&cpuCount);

int result = SetProcessInfo(mask, cpu, ref modify);

在这里解释一下其中的要点,主要是我在使用的过程中碰到问题。

1)使用的那个DLL,可以是系统提供API的DLL,也可以使自己实现的DLL.

如果是自己的实现的DLL,函数的声明和实现方式如下:

extern “C” _declspec(dllexport) int WINAPI SetProcessInfo( int id, int* value, int* modify )
{

int a = id; //传进来的值
int b = *value; //传进来的是地址

*modify = 9; //可以更改外部的值
return b;
}

2)SetLastError = true 这句话的作用是参数指示方法是否保留 Win32″上一错误”。如果你调用的过程中得不到预想的结果,而且也没抛异常,可以用Marshal.GetLastWin32Error()来得到错误号。

3)针对参数类型,我的理解是:

a)如果参数是基本类型,则为值传递;

b)如果参数是指针

i)在调用时为变量的地址,则为指针传递。但这种情况要求调用者的context的为unsafe的。

ii)在调用时为ref 加变量名,则为引用传递,这种情况不需要unsafe的context。

因此,我认为DllImport主要解决的的问题有2个:

1)大量的Win32 API在.Net中没有实现托管的那部分。

2)你自身的工程中原有的大量基础库实现可以重用,而不用c#重写。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128720.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 前端_单页面开发_web前端框架

    前端_单页面开发_web前端框架   web移动端单页面开发,可适用于web端直接开发。本例需要使用require.js帮助实现。   单页面开发个人理解:对一个项目里面的所有html文件都拥有同一个url,通过hash值的改变来促发页面的跳转(hash为url后面的内容,如下面的#red和#green就是hash),如两个页面的url分别为(http://localhost:8000/views/index.htm…

    2022年10月13日
  • 超百个免费api接口,分享给你「建议收藏」

    超百个免费api接口,分享给你「建议收藏」API(应用程序编程接口)API(ApplicationProgrammingInterface,应用程序接口)是一些预先定义的函数,或指软件系统不…

  • BACnet协议_bip协议

    BACnet协议_bip协议一、什么是BACnet?BACnet,BuildingAutomationandControlnetworks的简称,即楼宇自动化与控制网络。是用于智能建筑的通信协议。一般楼宇自控设备从功

  • 算法交易:华尔街怪兽的核武器

    算法交易:华尔街怪兽的核武器1980年华尔街的黑客生涯:天时地利20世纪70年代末期,算法开始进入人们的工作,这一趋势席卷了世界各地的金融市场,标志着华尔街黑客时代已然来临。华尔街逐渐吸引了美国越来越多杰出的数学家和科学家投身于编写交易算法的工作。在布莱克?斯科尔斯统治市场之前,已经有少数工程师和科学家进入曼哈顿下城市场了,但他们大都是外来移民。麻省理工、哈佛和此类高等学府的工程楼和科学楼成了招聘者竞相争夺人才…

  • 栈 数据结构_单调栈和单调队列

    栈 数据结构_单调栈和单调队列单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:数据出栈的序列为单调递增序列单调递减栈:数据出栈的序列为单调递减序列ps:这里一定要注意…

  • Java学习书籍整理

    Java学习书籍整理不知不觉中,做Java开发已经四年了,趁着现在换了工作,还算比较闲,就整理一下自己学习的一些知识。在学习过程中,我喜欢找的一些电子书来系统化的学习,多数时候我都只是做一个大概的了解,没有深入学习,基本就是看下目录,看下前几章的内容,深入的只会在实际用的时候才去详细看了。我从以下几个方面整理了一下这些学习的电子书,分享给大家,免得到处去找这些资源,百度脑图里面的分类也…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号