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#重写。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux查找文件位置命令_linux如何查找文件

    linux查找文件位置命令_linux如何查找文件查找文件在linux中,我经常碰到一个问题,就是如何找到某个文件,有时可能是找配置文件,有时是确认软件是否安装等等。精确查找find/-name”文件名”:在/根目录下按名称查找文件模糊查找find/-name”*文件名*”:在/根目录下按*名称*模糊查找文件当然,-name这个参数也有其他,也就是按特征查找,具体参考linux下查找某个文件位置的方法…

    2022年10月26日
    0
  • dropout层

    dropout层之前了解的网络都是在全连接层加dropout层,防止模型过拟合。在看deepfm的模型的时候,发现在每一层都可以加入dropout层对dropout层的深入理解做分类的时候,Dropout层一般加在全连接层防止过拟合提升模型泛化能力。而很少见到卷积层后接Dropout(原因主要是卷积参数少,不易过拟合)er类似卷积神经网络,只是在最后的全连接层使用dropout,循环神经…

    2022年6月10日
    61
  • C++编程工具(java常用工具)

    给c++程序员的一份礼物-常用工具集■…开发环境  —->Turboc  DOS时代c语言开发的经典工具,目前适合两类人使用:c语言beginner(尤其是学生一族),具有怀旧情节的专业人士:)  —->VisualC++6.0/7.0  稳定而强大的IDE开发环境,具有丰富的调试功能,定制宏的功能也是其一大特色。Microsoft的经典之作,功能强大自不必言说

    2022年4月13日
    44
  • windows虚拟内存机制

    windows虚拟内存机制

    2022年3月6日
    61
  • evicted Pod

    evicted PodapiVersion:v1kind:Podmetadata:annotations:checksum/config:8476fd6406a3cc87e5471154d85fd7c50e6a629acda16989a09a5d90937bb5b0cni.projectcalico.org/podIP:192.168.1.233/32creationTimestamp:”2019-09-22T06:26:34Z”generateName:test-ap…

    2022年5月13日
    36
  • java 函数式编程(java自定义函数)

    以前写过一篇java8的流操作,人们都说流操作是函数式编程,但函数式编程是什么呢?什么是函数式编程什么是函数式编程?它是一种编程范式,即一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的——要么是函数参数,要什么是函数返回值。函数式编程语言里没有for/next循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归、把函…

    2022年4月18日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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