windows核心编程--线程高级

Windows高级编程C#教程系列(1-6章) C#(读作“C Sharp”)是一种简单、现代、类型安全的面向对象的编程语言。它由微软公司开发,旨在与.NET Framework运行时环境配合使用。C# 结合了Visual Basic的快速开发能力和C++的强大功能,以其简洁、优雅和表达力强而闻名。在C#中,类是一种基本的面向对象编程的概念,用于定义对象的蓝图。通过类,我们可以创建具有相似特性的对象,这些对象被称为类的实例。下面的代码块展示了如何定义一个简单的类以及如何创建类的实例。set;set;// 构造函数Age = age; 阅读详情
暂停和恢复线程的运行

在 线程内核对象的内部有一个值,用于指明线程的暂停计数。当调用C r e a t e P r o c e s s或C r e a t e T h r e a d函数时,就创建了线程的内核对象,并且它的暂停计数被初始化为1。当线程的暂停计数是0的时候,除非线程正在等待其他某种事情的发生,否则该线程就处于 可调度状态。

恢复线程,可以用将调用R e s u m e T h r e a d
并将C r e a t e T h r e a d函数时返回的线程句柄传递给它(或者是将传递给C r e a t e P r o c e s s的p p i P r o c I n f o参数指向的线程句柄传递给它):

 

DWORD ResumeThread(HANDLE hThread);
当创建线程时,除了使用C R E AT E _ S U S P E N D E D外,也可以调用S u s p e n dT h r e a d函数来暂停线程的运行:

 

DWORD SuspendThread(HANDLE hThread);
暂停和恢复进程的运行

对 于Wi n d o w s来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得C P U时间。Wi n d o w s确实允许一个进程暂停另一个进程中的所有线程的运行,但是从事暂停操作的进程必须是个调试程序。特别是,进程必须调用Wa i t F o r D e b u g E v e n t和C o n t i n u e D e b u g E v e n t之类的函数。
VOID SuspendProcess(DWORD dwProcessID, BOOL fSuspend)
{
   
//Get the list of threads in the system.

   HANDLE hSnapshot = CreateToolhelp32Snapshot(
      TH32CS_SNAPTHREAD, dwProcessID);

   
if(hSnapshot !=
 INVALID_HANDLE_VALUE) 
   
{
      
//Walk the list of threads.

      THREADENTRY32 te = { sizeof(te) };
      BOOL fOk 
= Thread32First(hSnapshot, &
te);

      
for(; fOk; fOk = Thread32Next(hSnapshot, &
te)) 
      
{
         
//Is this thread in the desired process?

         if(te.th32OwnerProcessID == dwProcessID) 
         
{
            
//Attempt to convert the thread ID into a handle.

            HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME,
               FALSE, te.th32ThreadID);

            
if(hThread !=
 NULL) 
            
{
               
//Suspend or resume the thread.

               if(fSuspend)
                  SuspendThread(hThread);
               
else

                  ResumeThread(hThread);
            }

            CloseHandle(hThread);
         }

      }

      CloseHandle(hSnapshot);
   }

}
以上是作者实现的,但是有的时候会出错.

 睡眠方式

线程也能告诉系统,它不想在某个时间段内被调度。这是通过调用S l e e p函数来实现的:

VOID Sleep(DWORD dwMilliseconds);
关于S l e e p函数,有下面几个重要问题值得注意:

• 调用S l e e p,可使线程自愿放弃它剩余的时间片。

• 系统将在大约的指定毫秒数内使线程不可调度。不错,如果告诉系统,想睡眠1 0 0 m s,那么可以睡眠大约这么长时间,但是也可能睡眠数秒钟或者数分钟。记住, Wi n d o w s不是个实时操作系统。虽然线程可能在规定的时间被唤醒,但是它能否做到,取决于系统中还有什么操作正在进行。

• 可以调用S l e e p,并且为d w M i l l i s e c o n d s参数传递I N F I N I T E。这将告诉系统永远不要调度该线程。这不是一件值得去做的事情。最好是让线程退出,并还原它的堆栈和内核对象。

• 可以将0传递给S l e e p。这将告诉系统,调用线程将释放剩余的时间片,并迫使系统调度另一个线程。但是,系统可以对刚刚调用S l e e p的线程重新调度。如果不存在多个拥有相同优先级的可调度线程,就会出现这种情况。

转换到另一个线程

系统提供了一个称为S w i t c h To T h r e a d的函数,使得另一个可调度线程(如果存在能够运行):

BOOL SwitchToThread();

当 调用这个函数的时候,系统要查看是否存在一个迫切需要C P U时间的线程。如果没有线程迫切需要C P U时间,S w i t c h To T h r e a d就会立即返回。如果存在一个迫切需要C P U时间的线程,S w i t c h To T h r e a d就对该线程进行调度(该线程的优先级可能低于调用S w i t c h To T h r e a d的线程)。

线程的运行时间

//Get the current time (start time).
DWORD dwStartTime = GetTickCount();

//
Perform complex algorithm here.

//Subtract start time from current time to get duration.

DWORD dwElapsedTime = GetTickCount() - dwStartTime;

这个代码做了一个简单的假设:即它不会被中断。但是,在抢占式操作系统中,永远无法知道线程何时被赋予C P U时间。



幸运的是,Wi n d o w s提供了一个称为G e t T h r e a d Ti m e s的函数,它能返回这些信息:

 

BOOL GetThreadTimes(HANDLE hThread,   PFILETIME pftCreationTime, PFILETIME pftExitTime,   PFILETIME pftKernelTime, PFILETIME pftUserTime);

使用实例

__int64 FileTimeToQuadWord(PFILETIME pft) 
{
   
return
 (Int64ShllMod32(
      pft
->dwHighDateTime, 32) | pft->
dwLowDateTime);
}


void PerformLongOperation() 
{
   FILETIME ftKernelTimeStart, ftKernelTimeEnd;
   FILETIME ftUserTimeStart,   ftUserTimeEnd;

   FILETIME ftDummy;
   __int64 qwKernelTimeElapsed, qwUserTimeElapsed,
      qwTotalTimeElapsed;

   
//Get starting times.

   GetThreadTimes(GetCurrentThread(), &ftDummy,
      
&ftDummy, &ftKernelTimeStart, &
ftUserTimeStart);

   
//
Perform complex algorithm here.

   
//Get ending times.

   GetThreadTimes(GetCurrentThread(), &ftDummy,
      
&ftDummy, &ftKernelTimeEnd, &
ftUserTimeEnd);

   
//
Get the elapsed kernel and user times by 
   
//
converting the start and end times 
   
//
from FILETIMEs to quad words, and then 
   
//subtract the start times from the end times.


   qwKernelTimeElapsed 
= 
      FileTimeToQuadWord(
&ftKernelTimeEnd) -

      FileTimeToQuadWord(
&ftKernelTimeStart);

   qwUserTimeElapsed 
=
 
      FileTimeToQuadWord(
&ftUserTimeEnd) -

      FileTimeToQuadWord(
&ftUserTimeStart);

   
//
Get total time duration by adding the kernel
   
//and user times.


   qwTotalTimeElapsed 
= qwKernelTimeElapsed + 
      qwUserTimeElapsed;

   
//
The total elapsed time is in 
   
//qwTotalTimeElapsed.

}

注意,G e t P r o c e s s Ti m e s是个类似G e t T h r e a d Ti m e s的函数,适用于进程中的所有线程:

BOOL GetProcessTimes(HANDLE hProcess,   PFILETIME pftCreationTime, PFILETIME pftExitTime,   PFILETIME pftKernelTime, PFILETIME pftUserTime);

对于高分辨率的配置文件来说, G e t T h r e a d Ti m e s并不完美。Wi n d o w s确实提供了一些高分辨率性能函数:

BOOL QueryPerformanceFrequency(   LARGE_INTEGER* pliFrequency);BOOL QueryPerformanceCounter(   LARGE_INTEGER* pliCount);

虽然这些函数认为,正在执行的线程并没有得到抢占的机会,但是高分辨率的配置文件是为短期存在的代码块设置的。为了使这些函数运行起来更加容易一些,我创建了下面这个C + +类:

class CStopwatch 
{
public
:
   CStopwatch() 
   
{ 
      QueryPerformanceFrequency(
&
m_liPerfFreq);
      Start();
   }


   
void Start() 
   
{ 
      QueryPerformanceCounter(
&
m_liPerfStart);
   }


   __int64 Now() 
const 
   
{
      
//
Returns # of milliseconds since
      
//Start was called


      LARGE_INTEGER liPerfNow;
      QueryPerformanceCounter(
&liPerfNow);

      
return (((liPerfNow.QuadPart -
 
         m_liPerfStart.QuadPart) 
* 1000)/

         m_liPerfFreq.QuadPart);
   }


private:

   
//Counts per second

   LARGE_INTEGER m_liPerfFreq;   

   
//Starting count

   LARGE_INTEGER m_liPerfStart;  
}
;

使用这个类如下:(这样的封装类很多的,我的blog有介绍)

//Create a stopwatch timer
//(which defaults to the current time).

CStopwatch stopwatch;

//
Execute the code I want to profile here.

//Get how much time has elapsed up to now.

  __int64 qwElapsedTime = stopwatch.Now();

//
qwElapsedTime indicates how long 
//
the profiled code executed in milliseconds.

运用结构环境(跟cpu的类型有关系)

环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方。

Wi n d o w s实际上允许查看线程内核对象的内部情况,以便抓取它当前的一组C P U寄存器。若要进行这项操作,只需要调用G e t T h r e a d C o n t e x t函数:

 

BOOL GetThreadContext(HANDLE hThread,   PCONTEXT pContext);

Wi n d o w s使你能够修改C O N T E X T结构中的成员,然后通过调用S e t T h r e a d C o n t e x t将新寄存器值放回线程的内核对象中:

 

BOOL SetThreadContext(HANDLE hThread,   CONST CONTEXT *pContext);

线程的优先级

若要设置和获得线程的相对优先级,必须调用下面的这些函数:

 

BOOL SetThreadPriority(HANDLE hThread,   int nPriority);

下面是检索线程的相对优先级的补充函数:

 

int GetThreadPriority(HANDLE hThread);



程序的优先级(进程的优先级)

下面是如何使一个进程将它自己的优先级类设置为空闲的例子:

 

BOOL SetPriorityClass(GetCurrentProcess(),   IDLE_PRIORITY_CLASS);

下面是用来检索进程的优先级类的补充函数:

 

DWORD GetPriorityClass(HANDLE hProcess);



动态提高线程的优先级等级

有些编程人员抱怨说,系统动态提高线程优先级等级的功能对他们的线程性能会产生一种不良的影响,为此M i c r o s o f t增加了下面两个函数,这样就能够使系统的动态提高线程优先级等级的功能不起作用:

 

BOOL SetProcessPriorityBoost(HANDLE hProcess,   BOOL DisablePriorityBoost);BOOL SetThreadPriorityBoost(HANDLE hThread,   BOOL DisablePriorityBoost);

这两个函数具有许多相似的共性,可以用来确定是激活还是停用优先级提高功能:

 

BOOL GetProcessPriorityBoost(HANDLE hProcess,   PBOOL pDisablePriorityBoost);BOOL GetThreadPriorityBoost(HANDLE hThread,   PBOOL pDisablePriorityBoost);


为前台进程调整调度程序(windows设置提供可以自定义优先执行application或后台的server)


Windows 2000实际上允许用户对这种调整进行相应的配置。在System Properties(系统属性)对话框的A d v a n c e d选项卡上,用户可以单击Performance Options(性能选项)按钮
 
LS-DYNA壳单元冲击仿真中的5个关键设置:以方管碰撞为例(含沙漏控制参数) 本文以方管碰撞为例,深入解析了LS-DYNA壳单元冲击仿真中的五个关键设置。重点探讨了沙漏控制参数(如IHQ=4)的选择逻辑、自接触算法优化、能量监控方法、材料模型(MAT_24)的真实应力-应变曲线与应变率效应设置,以及单元公式的选取。这些核心设置共同决定了仿真的精度与效率,是确保方管冲击仿真结果可靠性的基石。 阅读详情

相关推荐

基于Lumerical FDTD的光栅耦合器宽带特性仿真与实验验证

本文详细介绍了基于Lumerical FDTD软件对光栅耦合器进行宽带特性仿真的完整流程。通过复现一个针对1310nm波段优化的经典光栅耦合器案例,文章从结构建模、光源设置、监视器布置到仿真运行与结果分析,逐步解析了如何准确模拟其耦合效率与带宽特性,并将仿真结果与实验数据进行对比验证,为硅光芯片的设计与优化提供了实用指导。

weixin_29294597的博客 512

windows核心编程之线程暂停和恢复

每个线程都有一个线程内核对象,内核对象里包含各种信息 该对象里有一个暂停计数,当暂停计数大于0的时候,线程暂停 DWORD SuspendThread( HANDLE hThread //线程句柄 );//这个函数可以暂停线程,使得暂停计数加1 DWORD ResumeThread( HANDLE hThread // 线程句柄 );//这个函数使得线程的暂停计数减1,

baidu_25539425的博客 1605

华为防火墙 策略路由实现多ISP接入Internet

PC3上网访问Server1时走ISP1。PC4上网访问Server1时走ISP2。1、配置接口IP并加入相应的安全区域。二、ISP2 运营商 R2路由器。一、ISP1 运营商 R1路由器。

一直被模仿,从未被超越 3015

C++枚举线程方法

主要使用的下面几个函数: 1、CreateToolhelp32Snapshot 2、Thread32First 3、Thread32Next 所以要引用下面的头文件: #include 枚举线程的代码如下: // 枚举系统当前所有线程信息 // 并把信息输出到工程目录下EnumInfo_thread.txt BOOL EnumThreadInfo () { // 定义线程信息

钟斌的博客 4919

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

windows C++ 遍历进程线程以及进程加载的模块

本文是基于Win32 API函数实现遍历进程、遍历线程和遍历进程加载模块等获取系统信息的操作。

qq_43179054的博客 3010

实例详解C++程序的五大内存分区

本文详细讲述C++程序在运行时的5大内存分区。 下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。 1、栈内存区 栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区。栈分区是用来存放函数参数及函数局部变量值的内存区,是由编译器在编译时自动分配和释放的。 函数中的参数与函数中的局部变量占用的内存是代码执行到函数(进入函数)是分配的,在............

dvlinker的技术专栏 1万+

windows C++ 进程遍历、线程遍历模板。后附模板代码

进程遍历是windows软件必备需求,从安装到软件运行再到卸载我们或许都需要知道其他进程的信息。

Bobowen的博客 2688

Python 爬虫实战:解析 JSON 数据爬取今日头条热点新闻(API 接口逆向与字段提取)

在当今信息爆炸的时代,新闻资讯的获取变得尤为重要。今日头条作为国内领先的新闻聚合平台,其热点新闻数据具有很高的价值。本文将详细介绍如何通过 Python 爬虫技术,逆向解析今日头条的 API 接口,提取并解析 JSON 数据,最终获取热点新闻信息。

yansideyucsdn的博客 3210

小波变换完全指南:从原理到实践的深度解析

在信号处理领域,傅里叶变换长期以来一直是频域分析的主要工具。然而,傅里叶变换存在一个根本性的局限:它只能告诉我们信号中包含哪些频率成分,却无法告诉我们这些频率成分在什么时刻出现。这就像是你知道一首歌用了哪些音符,却不知道这些音符的演奏顺序。小波变换(Wavelet Transform) 应运而生,它完美地解决了这个问题。小波变换不仅能够提供频率信息,还能同时提供时间信息,实现了信号的时频联合分析。本文将带你从零开始,深入理解小波变换的原理、实现和应用。傅里叶变换的定义如下: 它使用正弦和余弦这样的全局基函数

电脑管家 211

Windows编程看什么书?

Windows 程序设计第5版上、下册   原书名: Programming Windows (Fifth Edition)   原出版社:Microsoft Press   作者:(美)Charles Petzold   译者:北京博彦科技发展有限责任公司   出版社:北京大学出版社   出版日期:2001-03   页码:1376   定价:160:00RMB   此书被认为是Windows编

ysw1234的专栏 2841

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。版本如何关闭模块复用后铜皮自动从动态变成静态操作指导。如何关闭这个功能,具体操作如下。

weixin_54787054的博客 1261

018_《Delphi下深入Windows核心编程》

本书是一本介绍Windows核心技术及高级技巧的专著。从系统内核编程出发,使用大量的例子帮助读者理解这些编程技术,讲述了线程同步及隐藏、系统钩子深入分析、读写物理磁盘的关键技术、读写物理内存和其他进程内存的核心技术、Windows 9x下调用16位实模式和保护模式代码的核心技术、直接读写端口技术、可执行文件加壳的技巧、PE结构分析、Ring0的实现、Windows API截取技术、屏幕取词技术等方面的内容。全书对热点源代码进行了深入剖析和讲解,同时本书汇聚了作者利用Soft-ICE跟踪调试经验,作者多年的编

敦格 3770

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows核心编程:用户模式下的线程同步

 作者:shenzi链接:http://blog.youkuaiyun.com/shenziWindows核心编程:用户模式下的线程同步     在以下两种基本情况下,线程之间需要相互通信: 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性;一个线程需要通知其它线程某项任务已经完成。1.原子

shenzi的天空 2017

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《Windows核心编程第五版》英文原版PDF资源介绍

《Windows核心编程第五版》英文原版PDF资源介绍 【下载地址】Windows核心编程第五版英文原版PDF资源介绍 《Windows核心编程第五版》是Windows平台编程的权威指南,英文原版PDF资源为您提供深入的学习体验。本书全面解析了Windows操作系统的核心机制,涵盖进程与线程管理、内存管理、文件系统操作、...

gitblog_06722的博客 521

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Windows核心编程学习文档

一、CreateProcess CreateProcess为启动进程函数:下面已启动NOTEPAD记事本进程为例阐述CreateProcess,函数的用法;   lpApplicationName:可执行文件的名称,(可不包含路径)。如果该参数为NULL,那必须 在参数lpCommandLine中传递文件名称。 lpCommandLine:传递给执行的文件的命令行参数。如果lpAppli

xlm289348的专栏 2797

Windows核心编程

Windows核心编程学习01.Winwods核心编程:字符和字符串处理02.Windows核心编程:内核对象03.Windows核心编程:进程04.Windows核心编程:线程基础05.Windows核心编程:作业06.Windows核心编程:线程调度07.

shenzi的天空 2567

[笔记]Windows核心编程《八》用内核对象进行线程同步

参考1 参考2 文章目录前言用户模式下的同步机制内核模式下的同步机制等待函数WatiForSingleObjectWaitForMultipleOBjecs例等待成功所引起的副作用事件内核对象CreateEvent函数CreatEventEx创建对象可等待的计时器内核对象信号量内核对象互斥量内核对象线程同步对象速查表其他的线程同步函数 前言 用户模式下的同步机制 用户模式下的同步机制的特点就是速度快,但也有些局限性, 例如, 对Interlocked系列函数只能戳一个值进行操作,它们从不会把线程切换到等待

二次元怪兽的博客 726

Windows编程的几本经典著作

Windows 程序设计(第5版): Programming Windows (Fifth Edition)作者:Charles Petzold此书被认为是Windows编程最好的导论性读本。在1994年5月,此书的作者Charles Petzold被《Window Magazine》和Microsoft公司授予”Windows Pioneer”奖,以表彰他对Microsoft Windows的成

china1000的专栏 1170

(C/C++)Windows编程

Windows编程的核心都在这里,带给你不同的体验

MOON_YZM的博客 3318
上一篇: windows核心编程--线程
下一篇: windows消息机制
strollerV
博客等级 码龄20年 13粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值