自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 flash外链测试

<br />

2011-02-11 17:31:00 637

原创 Flex Tree组件Demo

这个DEMO可以创建一个全新的树型结构,让我感到奇怪的是,虽然我用XML而不是XMLListCollection/ArrayCollection作为Tree的数据源,但对XML的更新依然会在Tree中反映出来——这似乎和Flex的文档有冲突,下面是引用Flex文档的一段内容:Raw objects are often not sufficient if you have data that

2009-12-28 22:50:00 2844 1

原创 Windows Via C/C++:内核模式下的线程同步——事件内核对象

事件(Event)对象可以说是最简单的内核对象,它包含一个引用计数、一个用来表示该对象是自动重置还是手动重置的布尔值和一个表示对象当前状态(signaled或unsignaled)的布尔值。事件标志着某动作的完成,事件对象分为两类:manual-reset(手动重置事件)和auto-reset(自动重置)事件。当manual-reset事件状态变为signaled时,所有等待该事件的线程都成为可调

2009-11-24 23:23:00 1797

原创 Windows Via C/C++:内核模式下的线程同步——概述

上一章中,我们讨论了在用户模式下同步线程的各种方法。用户模式下同步机制的效率较高,但也存在局限。比如临界区(Critical Sections)只能用来同步同一进程内的线程,而且由于无法指定等待超时时间,使用临界区时也极有可能发生死锁。本章将阐述如何在内核模式下同步线程,你将会看到,使用内核对象同步线程比用户模式下的同步方法更为通用。事实上,使用内核对象的唯一不足之处是性能问题——当使用内核对象同

2009-11-22 22:19:00 1077

翻译 Windows Via C/C++:内核模式下的用户同步——成功等待的副作用

对某些内核对象,成功调用WaitForSingleObject/WaitForMultipleObjects时对象的状态会自动改变。“成功调用”是指WaitForXXX函数返回WAIT_OBJECT_0相关的值,函数返回值是WAIT_TIMEOUT或WAIT_FAILED时,内核对象的状态不会发生任何变化。我把对象的状态因成功调用Wait函数而改变称之为“成功等待的副作用” (successf

2009-11-22 22:02:00 1093

翻译 Windows Via C/C++:内核模式下的线程同步——WaitForSingleObject/WaitForMultipleObjects函数

Wait函数族会使当前线程进入等待状态,直到指定的内核对象状态变为signaled或等待超时时才被重新调度。如果在调用WaitXXX时指定的内核对象状态已是signaled,则WaitXXX马上返回。迄今为止,最常用的Wait函数便是WaitForSingleObject:DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMill

2009-11-15 21:34:00 2929

翻译 Windows Via C/C++:用户模式下的线程同步——轻量级读写锁(Slim Reader-Writer Locks)

注意,本节讨论的Slim Reader-Writer Locks和下一节讨论的条件变量(Condition Variable)是微软从Vista开始才提供的新同步对象和临界区的作用类似,轻量级读写锁(Slim Reader-Write Lock,以下简称SRWLock)用来同步多线程对共享资源的访问,与临界区不同的是,SRWLock能够区分读取共享资源的线程(读者)和修改共享资源的线程(修

2009-11-08 20:25:00 2894

翻译 Windows Via C/C++:用户模式下的线程同步——Condition Variables 条件变量

注意,上一节讨论的Slim Reader-Writer Locks和本节讨论的条件变量(Condition Variable)是微软从Vista开始才提供的新同步对象条件变量你已经知道在同步生产者和消费者线程时,可以使用SRWLock以共享读或排它写的方式保护被访问的资源。试想一下,假如消费者线程获得锁之后发现缓冲区中没有可供消费的资源,它就应该释放锁并一直等待生产者线程向缓冲区内写入

2009-11-08 20:25:00 3374

翻译 Windows Via C/C++:用户模式下的线程同步——临界区 Critical Sections

临界区临界区(Critical Section)是一段被保护的代码块,在任意时刻,最多只能有一个线程进入该代码块,即对临界区的访问是原子的、排它的,因此常把一些需要同步的受保护资源放在临界区中。临界区的原子性,是指在临界区中线程不能并发执行。当然,系统仍然可以中断当前线程的执行并调度其它线程,但是系统不会调度那些请求进入该临界区的线程,直到当前线程离开临界区。下面是一段可能会产生问题的

2009-11-03 23:09:00 3450

翻译 Windows Via C/C++:用户模式下的线程同步——Cache行

为了提升运行在多处理器上的程序的性能,你应该了解CPU Cache的概念。当CPU从内存中读取某个字节时,它会按Cache中数据块大小(也就是Cache行大小)将一整块数据读到CPU的Cache中。比如Cache数据块大小是32,则内存地址按Cache行大小对齐形成0~31、32~63、……、32n~32(n+1)这样的块,当要读取的字节地址为41时,CPU将把包含该地址的整个内存块(32~63)

2009-10-31 01:02:00 1619

翻译 Windows Via C/C++:用户模式下的线程同步——原子操作:Interlocked函数族

原子操作在线程同步中的地位非常重要,它保证了当线程访问某资源时其它线程无法在同一时刻访问该资源。以下面的代码为例: // Define a global variablelong g_x = 0;DWORD WINAPI ThreadFunc1(PVOID pvParam){ g_x ++; return 0;}DWORD WINAPI ThreadFun

2009-10-30 21:12:00 5815 4

原创 Windows Via C/C++:用户模式下的线程同步——概述

在Windows系统最理想的运行环境下,所有线程互不通信、在完全隔绝的环境中运行,然而这种情况极少出现。通常,线程需要等待其它线程占用的资源或等待其它线程的执行结果。线程通常需要使用系统资源,比如堆、串口、文件、窗口等。假如某线程对资源的请求是排它的,其它欲使用该资源的线程必须等待。线程对资源的占用有时候必须是排它的,比如当线程A向内存块中写入数据时,必须保证此时没有其它线程向同一内存块写入或

2009-10-28 19:33:00 1056

翻译 Windows via C/C++:线程的执行时间

计算线程执行某项任务消耗的时间时,许多开发人员会调用GetTickCount/GetTickCount64编写如下的代码:// Get the current time (start time)ULONGLONG qwStartTime = GetTickCount64();// Perform complex algorithm here// Subtract sta

2009-10-26 20:06:00 4734

翻译 Windows Via C/C++:线程的睡眠和切换

睡眠:Sleep线程可以调用Sleep函数使其在指定时间内不被调度: VOID Sleep(DWORD dwMilliseconds); Sleep调用会挂起当前线程,dwMilliseconds毫秒之后再将其恢复为可调度的。Sleep函数有以下几点值得注意: Sleep调用会导致当前线程放弃其剩余的时间片 Sleep调用时,系统挂起当前线程的时长

2009-10-25 00:51:00 9036

翻译 Windows Via C/C++:线程的挂起和恢复

使用CreateThread函数创建线程或CreateProcess创建进程时,系统会创建线程/主线程内核对象,并将其中的暂停计数(suspend count)置为1,这样CPU调度程序会认为该内核对象不可调度,线程得以完成其初始化。初始化完成后,CreateThread/CreateProcess函数检查调用者是否传递了CREATE_SUSPENDED标志,若是,CreateThread/Cre

2009-10-24 20:33:00 7457 2

翻译 Windows via C/C++:线程调度——概述

基于优先级的操作系统(preemptive operating system)必须使用某种算法以决定CPU如何调度系统中的线程,本章将讨论Windows Vista使用的调度算法。 我们之前讨论过线程的上下文结构CONTEXT,其中含有线程最后一次执行时CPU寄存器组的状态。 操作系统每20毫秒检查系统中所有线程内核对象的状态,其中一些对象被认为是可调度(scheduable)的,操作系统会从可调

2009-10-24 17:23:00 1395

翻译 使用C/C++运行时库函数操作线程

Visual Studio包含了4个本机C/C++运行时库和2个用来管理MS.NET的C/C++运行时库。所有这些库都支持多线程编程环境:目前已经没有专门为单线程开发设计的C/C++运行时库了。表6-1对这些库进行了描述: Libray Name Description LibCMt.libStatically linke

2009-10-19 20:03:00 3670

翻译 Windows Via C/C++:线程实现细节

我们已经了解如何定义线程入口点函数、调用系统API创建执行指定函数的线程。本节将揭示这一切在系统内部是如何完成的。图6-1描述了线程创建并完成初始化后的状态。调用CreateThread会使系统产生一个线程内核对象,其引用计数(Usage count)被初始化为2(创建线程的进程和线程本身都引用了该内核对象),其它属性也完成了初始化:暂停计数(Suspend count)被设置

2009-10-18 23:35:00 1145

原创 windows下提升进程权限

windows的每个用户登录系统后,系统会产生一个访问令牌(access token),其中关联了当前用户的权限信息,用户登录后创建的每一个进程都含有用户access token的拷贝,当进程试图执行某些需要特殊权限的操作或是访问受保护的内核对象时,系统会检查其acess token中的权限信息以决定是否授权操作。Administrator组成员的access token中会含有一些可

2009-10-16 22:38:00 6302 2

翻译 Windows Via C/C++: CreateThread函数

CreateThread函数 前面讲过,进程的主线程会在CreateProcess调用时自动创建。假如你要手工创建线程,你可以调用CreateThread函数:HANDLE CreateThread( PSECURITY_ATTRIBUTES psa, DWORD cbStackSize, PTHREAD_START_ROUTINE pfnStartAddr, PV

2009-10-14 11:06:00 5658

翻译 Windows Via C/C++:线程入口点函数

线程入口点函数  线程必须指定要执行的入口点函数,我们已经知道主线程的入口点函数是_tmain/_tWinMain。手动创建线程时,其入口点函数格式如下:DWORD WINAPI ThreadFunc(PVOID pvParam){ DWORD dwResult = 0; ... return dwResult;}   线程入口点函数可以执行你指定的任何操作。线程在入

2009-10-11 20:34:00 2537

翻译 Windows Via C/C++:线程概述

线程概述理解线程是很重要的,因为进程的执行至少需要一个线程。本章会详细讨论线程,包括线程和进程之间的区别和各自的任务、线程内核对象及其属性、操作线程内核对象的各种方法、在进程内创建线程的方法等。 在第四章“进程”中,我们说过进程实际上由两部分组成:进程内核对象和进程地址空间。类似的,线程也包括两个部分: 线程内核对象:用于操作系统用于管理线程、存储线程统计信息线程栈:存储线程执

2009-10-10 21:52:00 662

原创 web开发中客户端脚本产生的浏览器缓存问题

国庆假之前,写了一个监控系统的参数配置系统,其中用到了ajax和服务器做异步请求。在我的机器和公司测试服务器测试时,一切正常,等发布到客户的服务器之后,发现后台server有时接收不到javascript脚本发送的ajax请求,使配置动作常常失效,但浏览器页面也没有错误报告。当天已经是9月30号了,客户那边的浏览器又是IE7,不能在本地调试,只好一遍遍的在公司用Firefox和fireBug调,搞

2009-10-09 20:10:00 1618

翻译 Windows Via C/C++:vista下的应用程序权限控制

when adminstrator runs as a standard userWindows Vista采用了一些新技术提高了终端用户使用系统时的安全性。其中对开发人员而言最为重要的应该是用户账户控制(User Account Control - UAC)。 在Windows系统中,许多用户都是以管理员账号登录的,由于管理员账号被赋于极高的权限,因此以该账号登录的用户几乎可以不受限制的

2009-10-08 22:07:00 3258

翻译 Windows via C/C++: 子进程

当你编写程序时,可能想让一段代码独立运行,比如调用函数或子例程,此时调用者必须等待函数或子例程返回,在大多数情况下,我们需要这种单任务的同步。另一种可选的方法将这段独立作业封装到新的线程中执行,此时我们就可以获得多任务的特性 ,这项技术非常有用,但是当你要获得新线程的执行结果时会引发同步问题。 另一种方法是创建一个子进程完成任务。当任务比较复杂时,如果使用多线程,可能会不小心破坏进程空间的数据

2009-10-07 18:36:00 1605

翻译 Windows via C/C++:终止进程

结束进程进程可以以4种方式结束: 主线程入口点函数(_tmain/_tWinMain)返回时结束,建议所有进程都以这种方式结束进程中的某线程调用了ExitThread函数,应当避免这种情况另一进程中的某线程调用了TerminateProcess函数,应当避免这种情况进程中的所有线程中止,这种情况比较罕见下面我们来分别讨论这4种情形。  主线程入口点函数返回

2009-10-07 18:11:00 4081 1

翻译 Windows Via C/C++: The CreateProcess function

CreateProcess函数  CreateProcess函数用于创建进程:BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL

2009-10-06 20:44:00 2391

翻译 Windows Via C/C++ Part Ⅰ Chapter4: 进程—第一个Windows程序(4)

进程的亲缘性  通常,进程中的线程可以在主机的任何CPU中执行,在有些情况下,你可能想让线程只运行在指定的CPU子集中,这叫做“处理器亲缘性”,我们将在第七章“线程调度、优先级和亲缘性”中讨论这个话题。进程的错误模式  每个进程都关联着一组标志位,用来告诉系统进程如何响应严重错误,比如磁盘介质错误、未处理的异常、文件未找到和数据偏差等。进程通过SetErrorMode函数设置该行为:

2009-08-31 21:44:00 710

翻译 Windows Via C/C++ Part Ⅰ Chapter4: 进程—第一个Windows程序(3)

进程的环境变量  每一个进程都有与其关联的环境块。进程环境块是在进程地址空间中分配的内存区域,其中含有类似下面格式的一组字符串: =::=::/ ...VarName1=VarValue1/0VarName2=VarValue2/0VarName3=VarValue3/0 ...VarNameX=VarValueX/0/0 每个字符串的第一部分是环境变量名,=号后面是相应的值。注意以=号开头的

2009-08-30 13:17:00 589

翻译 Windows Via C/C++ Part Ⅰ Chapter4: 进程—第一个Windows程序(2)

进程的实例句柄  加载到进程地址空间的每一个可执行文件或DLL文件都被赋于一个唯一的实例句柄。wWinMain/WinMain的第一个参数hInstance就是可执行文件的实例句柄。实例句柄通常用在加载资源的函数中,比如从某个可执行文件的映像中加载图标资源时,可以调用函数:HICON LoadIcon(HINSTANCE hInstance, PCTSTR pszIcon); Load

2009-08-29 15:19:00 861

翻译 Windows Via C/C++ Part Ⅰ Chapter4: 进程—第一个Windows程序(1)

编写第1个Windows应用程序  Windows支持两种类型的应用程序,分别基于控制台用户界面(Console User Interface-CUI)和图形用户界面(Graphical User Interface-GUI)。GUI应用程序拥有一个图形化的前端,它可以创建窗口、菜单,以对话框和用户交互,并使用所有的标准窗口组件。Windows附带的大多数软件,如记事本、计算器和写字板等,

2009-08-29 14:11:00 941

翻译 Windows Via C/C++ Part Ⅰ Chapter4: 进程(1)_概述

概述(Overview)   本章讨论系统如何管理所有正在运行的应用程序,我们将谈到什么是进程、系统如何使用进程内核对象来管理进程、进程对象的属性以及修改他们的方法、如何调用API产生进程以及进程如何终止等。  进程常被定义为正在运行的程序实例,它由两部分组成:(1) 操作系统用来管理进程、统计进程状态的内核对象。(2) 包含进程加载的所有可执行模块和动态链接库模块代码和数据的

2009-08-29 14:02:00 599

翻译 Windows Via C/C++ Part Ⅰ Chapter3: 内核对象(3)

跨进程共享内核对象 不同进程中的线程常常需要共享内核对象,比如:(1) 同一计算机上的两个进程使用文件映射对象共享数据块;(2) 在互联的计算机上的程序可以借助邮件槽或是命名管道互相发送/接收数据;(3) 不同进程中的线程可以使用用互斥量、信号量以及事件同步其执行。内核对象的句柄是进程间独立的,这给跨进程共享内核对象带来了一定的困难。在下面的讨论中,我们将展示三种不同的机制来共享内核对

2009-08-22 23:57:00 1021 1

翻译 Windows Via C/C++ Part Ⅰ Chapter3: 内核对象(2)

进程的内核对象句柄表 当进程初始化时,系统会给其分配一个句柄表用来存储与其相关的内核对象的信息。微软隐藏了句柄表的构造细节和管理模式,也没有提供相应的文档。通常我不会讨论没有文档支持的话题,但我会破例讨论句柄表,因为理解它对于Windows开发人员来说非常重要。句柄表的细节不为人知并且通常随着Windows版本而不断更新,因而以下的论述在细节上可能不完全准确。本节的话题用来帮助开发人员理解

2009-08-20 23:13:00 664

翻译 Windows Via C/C++ Part Ⅰ Chapter3: 内核对象(1)

概要在本章我们将通过接触内核对象及其句柄开始了解Micorosoft Windows application programming interface。本章并不会深入讲解关于特定类型内核对象的细节,而将重点放在所有内核对象通用的属性上。我原本可以开始直接讨论某一内核对象的具体细节,然而熟练掌握内核对象的基础知识对于windows软件开发者来说至关重要。操作系统和应用程序使用内核对象管理大量的资源

2009-08-20 00:14:00 975

翻译 Windows Via C/C++ Part Ⅰ Chapter 2: 字符和字符串(4)

(六) 为什么使用Unicode?我们极力推荐你在开发应用时选用Unicode编码处理字符(串),因为:Unicode 可以让你轻松的完成应用程序的国际化;Unicode 允许你发布支持所有语言的exe或dll;Unicode 可以改善代码的执行速度和内存使用率。这是因为Windows内部使用Unicode处理一切字符(串),因此当你使用不同的编码时,Windows必须分配额外

2009-08-17 21:26:00 577

翻译 Windows Via C/C++ Part Ⅰ Chapter 2: 字符和字符串(3)

(五) CRT中的安全字符串函数  涉及修改字符串的函数都面临潜在的危险:当目标缓冲区不足以容纳产生的字符串时会产生内存错误。比如下面的代码:// The following puts 4 characters in a 3-character buffer, resulting in memory corruptionWCHAR szBuffer[3] = L"";wcscpy(

2009-08-16 22:55:00 1019

原创 csdn.blog咋这么烂~~~~

写了三篇东西,其中一篇提交时变空白,另一篇写完后要求登录,登录后变空白。我真崩溃了。

2009-08-16 22:40:00 453

翻译 Windows Via C/C++ Part Ⅰ Chapter 2: 字符和字符串(2)

(三) Windows中的Unicode和ANSI函数   从Windows NT开始,所有的Windows版本均使用Unicode构建。所有的Windows核心函数均使用Unicode字符串。如果你调用这些函数时传递了ANSI字符串,函数首先将字符串转换为Unicode编码,然后将编码后的字符串传递给操作系统。如果你想让函数返回ANSI字符串,系统会在Unicode字符串返回之前将其编码

2009-08-16 13:22:00 507

翻译 Windows Via C/C++ Part Ⅰ Chapter 2: 字符和字符串(1)

[有删改] (一) 字符编码   如何处理不同的字符集一直是应用程序本地化的难题。一直以来,大多数开发人员将字符串编码为以0结尾的单字节字符序列,这是很自然的,当我们调用strlen时,它会返回以0结尾的字符数组中的字符数目——以单字节的形式。    然而有些语言的符号(如日本语),无法用只包含256个字符的单字节字符集完整描述。因此出现了双字节字符集(Double-Byte

2009-08-15 00:02:00 608

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除