摘要:
第十七章的实例有个利用 Memory-Mapped File 来实现进程间共享数据和通信。Step1:调用CreateFileMapping 函数创建一个 Memory-Mapped File Object。该函数的原型如下:HANDLE WINAPI CreateFileMapping( __in HANDLE hFile, __in LPSECURITY_ATTRIBUTES lpAttributes, __in DWORD flProtect, __in DWORD dwMaximumSizeHi... 阅读全文
随笔分类 - Windows核心编程(笔记)
Chapter16— A thread's Stack
2013-01-31 11:38 by java20130722, 159 阅读, 收藏,
摘要:
概述: 当创建一个线程的时候,系统会为它预留一定的地址空间去运行(每个线程都有自己的stack)。在默认情况下,每个线程的 Stack 为 1M。 当然,你还可以在编辑器中进行手动设置。在编译程序时,linker 会将 stack 大小的值嵌入到文件的 PE 头中,这样当程序加载运行时,系统会读取该值并为它设置相应大小的 stack。 除此之外,在调用 CreateThread 函数和 CreateProcess 函数时,还可以用参数去指定 Stack 的大小。示例: 说明:在下图中, “committed page” 表示线程实际使用的页面;"Reserved page" 阅读全文
Chapter15-重置内存内容(Resetting the Contents of Physical Storage)
2013-01-29 10:24 by java20130722, 241 阅读, 收藏,
摘要:
在正常的内存页面替换算法中,算法会优先选择将没被修改的页面替换出去,而让已修改的内存页面尽量久地留在内存中。并且,在windows系统下,当替换算法不得已要将一个已修改的页面替换出 RAM 时,系统还会先将替换的已修改页面备份到磁盘的分页文件(Paging file)中去(方便以后再次读取),而这个过程是比较慢的。 重置内存(Resetting storage)的意思就是主动告知系统:“这些页面没被修改过,你要替换它们时,不用备份到分页文件中去了。” 重置内存(Resetting storage)可以调用 VirtualAlloc 函数实现,需要将第三个参数设置为 MEM_RESET ... 阅读全文
Chapter11-"windows线程池" 之 内核对象触发调用回调函数
2013-01-26 23:58 by java20130722, 441 阅读, 收藏,
摘要:
众所周知,一般可以调用WaitForSingleObject、WaitForMultiObject来实现线程同步。但是当多个线程等待同一个内核对象变为触发态时,这并不是一种明智的做法,这样会浪费大量的系统资源。而windows线程池很有效提供系统性能。 利用windows线程池实现,当内核对象变为触发态时,自动调用一个回调函数,一如既往的需要四步创建对应的回调函数,回调函数必须符合如下原型VOID CALLBACK WaitCallback( _Inout_ PTP_CALLBACK_INSTANCE Instance, ... 阅读全文
C++ 定时器使用
2013-01-26 19:45 by java20130722, 475 阅读, 收藏,
摘要:
用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 ); 例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:UIN... 阅读全文
Chapter11-"windows线程池"之 间隔执行函数
2013-01-26 19:25 by java20130722, 497 阅读, 收藏,
摘要:
按照一定的时间间隔,周期性调用某个函数,大致需要用到以下五步按照一定的时间间隔,周期性被调用的TimerCallback函数的原型如下VOID CALLBACK TimerCallback( _Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_ PTP_TIMER Timer
);调用CreateThreadpoolTimer函数将TimerCallback函数通知给线程池(thread pool)PTP_TIMER WINAPI CreateThreadpoo... 阅读全文
Chapter11-"windows线程池"之异步调用函数
2013-01-26 15:18 by java20130722, 272 阅读, 收藏,
摘要:
利用线程池(thread pool)异步调用函数时,不需显式调用 CreateThread 函数,系统会为进程自动创建线程池(thread pool)。线程池的每个线程实际运行你事先定义好的回调函数。 写到这里,也许大多人会想:怎么不直接调用众所周知的 CreateThread 函数去创建线程?这里就有必要讲一下线程池(thread pool)的机制了。 线程池(thread pool)的线程在执行完后不是立即销毁的(CreateThread创建的线程执行完成以后就销毁了),而是再次进入线程池(thread pool),等待进程请求该线程的再次执行。线程池的这种机制使得在需要创建许多线... 阅读全文
__stdcall、__cdecl 、CALLBACK 几种函数修饰符
2013-01-26 10:19 by java20130722, 932 阅读, 收藏,
摘要:
CALLBACK == WINAPI ==__stdcall实际上就是一种调用模式,就是约定由调用函数来自行解决压栈参数,同 pascal 调用。回调函数只能是类的静态成员函数或是类外定义的全局函数#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define cdecl _cdecl
#ifndef... 阅读全文
VS中Debug版本和Release版本的区别
2012-12-21 21:26 by java20130722, 403 阅读, 收藏,
摘要:
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)Debug 版本参数含义/MDd /MLd 或 /MTd 使用 Debug runtime library (调试版本的运行时刻函数库)/Od 关闭优化开关 /D "_DEBUG&quo 阅读全文
CloseHandle()函数的使用
2012-12-21 16:48 by java20130722, 591 阅读, 收藏,
摘要:
CloseHandle()函数的使用很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );。。。。。这不是刚好创建又关闭了吗?线程怎么运行呢?答:Closing a thread handle does not terminatethe associated thread. To remove a thread object, you must terminate thethread, then close all handles to the thread 阅读全文
Chapter10-“I/O设备的同步和异步”之异步I/O简介
2012-08-21 19:03 by java20130722, 309 阅读, 收藏,
摘要:
异步I/O基础 相比于计算机上的其他操作,I/O操作时最慢的最不可预测的操作之一。如果使用同步I/O,虽然方便控制,但是浪费了大量的CPU时间;而异步I/O在一定程度上缓解了这个问题。 异步I/O就是将I/O请求发送给设备驱动器,让设备驱动器负责实际的I/O操作,当设备驱动器在等待I/O设备相应时,应用程序的线程不用被挂起去等待I/O操作的完成,线程可以跳过等待继续执行其他任务。异步I/O的关键就是将所有的I/O请求队列化,然后以异步的方式执行I/O操作,在I/O操作完成之后再通知相应的程序。 如果编程使用异步I/O操作?首先,你在使用CreateFile函数打开或创建设备时,需要在dwFla 阅读全文
Chapter10-“I/O设备的同步和异步”之I/O设备同步操作
2012-08-09 19:11 by java20130722, 159 阅读, 收藏,
摘要:
最常用的两个函数-WriteFile、ReadFileBOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);ReadFil 阅读全文
Chapter10-“I/O设备的同步和异步”之文件操作相关
2012-08-09 15:35 by java20130722, 220 阅读, 收藏,
摘要:
获取文件的逻辑大小——GetFileSizeEx函数函数原型:BOOL WINAPI GetFileSizeEx( __in HANDLE hFile, __out PLARGE_INTEGER lpFileSize );GetFileSizeEx函数的第一个参数就不多说了,hFile就是CreateFile函数返回的句柄;第二个参数lpFileSize是一个指向64bit union的指针.获取文件的物理大小——GetCompressedFileSize函数函数原型:DWORD WINAPI GetCompressedFileSize( ... 阅读全文
Chapter10-“I/O设备的同步和异步”之打开和关闭设备
2012-08-08 19:21 by java20130722, 178 阅读, 收藏,
摘要:
打开设备:CreateFile函数函数原型:HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile); 首先不要被它的名字所迷惑,这个函数不仅可以打. 阅读全文
Chapter09-“内核模式下的线程同步”之互斥量内核对象
2012-08-07 16:24 by java20130722, 329 阅读, 收藏,
摘要:
互斥量内核对象确保线程对某一个单一资源拥有一个互斥排外的访问权限.互斥量内核对象和临界区域有点相似,不过一个处于用户态(速度快),一个处于内核态(速度慢).由于互斥量是内核对象,所以不同进程的线程也可以访问同一个互斥量;而临界区域就不行,只有同一个进程内的线程才能访问得到。 一个互斥量内核对象包括:一个使用计数(usage count), 一个线程ID(thread ID),一个递归计数(recursion counter)。线程ID标记当前拥有互斥量的线程;递归计数标记这个线程拥有互斥量的次数;下面再介绍互斥量相关函数No.1 互斥量内核对象创建函数——CreateMutex函数 HAND. 阅读全文
浙公网安备 33010602011771号