| 海风月影's profile海风月影BlogListsNetwork | Help |
|
海风月影Reverse Crack Algorithm 测试一下
用WEBBROWSER控件实现在浏览器中点击超链接时不弹出新窗口,新页面永远在当前窗口显示用WEBBROWSER控件实现在浏览器中点击超链接时不弹出新窗口,新页面永远在当前窗口显示
程序很简单,用VB6实现,其他语言类似,xp pro sp2 下编译通过。
原理:建立2个WEBBROWSER控件,当WebBrowser1需要弹出新窗口的时候,将窗体设为我们的WebBrowser2,然后在WebBrowser2_BeforeNavigate2中cancel掉WebBrowser2,并将WebBrowser2 的URL传给WebBrowser1,用WebBrowser1打开网页。将WebBrowser2.visible设为flase,不可见。OK,这样就达到效果了
代码:
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
Set ppDisp = Form1.WebBrowser2.Object End Sub Private Sub WebBrowser2_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean) WebBrowser1.Navigate URL Cancel = True End Sub 偶变了。。。。。每天早上去公司,要坐公交车,这辆车早上老人比较多,以前偶都主动给老人让座,现在偶发现偶变了。。。基本不给别人让座了。。。。。。。。惭愧,惭愧。。。 被点名,无奈回答问题忽然被传说中的fly点名,好像要回答问题 1.你最喜欢的食物是什么?你会让你未来的爱人为你亲手做这道菜吗? 吃过的都很喜欢,会的
2.你曾经在逛街或者地铁站幻想过遇到一个帅哥/美女,他/她主动和你搭讪,你希望你们之间发生什么样的事情吗?
没想过。。
3.假如老天就给你只剩3天的时间可以活了,你打算怎么度过这宝贵的3天,期待有什么样的事情发生呢?
睡觉,或者跳崖,前者轻松,后者刺激
4.假如你有一个魔镜,你打算用它做什么?
看看世界,从上帝的角度
5.谈谈你未来10年的远大计划吧。
努力,成为成熟技术人士
6.心目中的白马王子/公主是谁?
米有
7.将来会不会要求自己的老公或为自己的老婆做家务?
不一定
8.对自己现在的生活满意吗?
还好
9.如果现在给你10万块钱,你会拿来做什么?
投资
10.打算什么时候把自己嫁出去或娶老婆?
娶!
11.男女之间有纯粹的友谊么?
基本没有
12.最近一次失眠是为了什么事情?
工作犯愁
13. 爱情重要么?
很重要
14.我在你眼里是怎样的人?
恩,好人
唉,文人啊
15.你眼中的世界是什么颜色的?
蓝色
16.如果让你自己重新给世界上色,你会选择什么颜色?
白色,世界很多地方太黑暗,要白一点
17.你对自己的性别满意吗?
显然满意
18 如果可以随意选择,你想要上什么大学,什么专业?
麻省理工,计算机系
19 如果世界上只能保留一种艺术,在音乐,绘画,雕塑,诗歌,etc.中,你会选择哪一种?
音乐
20 说说自己喜欢的季节和原因。
秋季,不热不冷
21 会不会因为文字和音乐莫名的喜欢上一座城市,是哪个和哪座。
不会,没这个境界
22 最近在看什么书呢?有什么心得吗? 没书看。。
23 本命年你会选择穿红色内裤吗?为什么?
为什么要穿 啊
24 最近生活中最大的变化是什么?
越来越累
25 老妈和老婆或是老公掉进河里,你会先救谁?
不知道,没这个可能性
26.你最想改变身上的哪一个缺点?
近视
27.如果给你一次机会,你想从自己多大那一年从头过起?
大一
28.你未来最想定居的城市?
天城,浮在空中
29.你觉得你现在的工作和你的理想距离大吗?
有点大
30.你觉得你的屁股够翘么?
不
31.你爱你的男/女朋友么?
当然
32.你有情人么?
不懂
33.你会选择每天睡觉3小时的工作么?
不会,太累了
34.你最想成为一个什么样的人?最欣赏什么样的人?
成功的人,十年磨一剑的成功人士
35.2007年你最想做的是什么事情?
找个好工作,并且好好工作
36.最喜欢歌曲的名字(就一首)
我BLOG上的
37 是不是经常感到迷茫?
是的,人活着太苦了
38. 将来想过什么样的生活?
快乐就行
39. 长这么大给你印象最深的一件事/一本书/一部电影是什么?
没想过,最近郁闷,想不出来
40.最喜欢金庸小说里的哪个人物?
乔峰!男子汉
41.什么时候最开心?
轻松的时候,没压力的时候
42. 生过得最严重的病?
水痘
43. 小时候最大的梦想是什么?
做个科学家,可惜没几会了
44.你最后悔的一件事情是什么?你想怎么弥补?
没有后悔的事情
自己想的题目
45.这样点名累嘛?
很累
开始点名:老卜,杨帆,逆风飞舞,苏苏,for beck Visual C++线程同步技术剖析 (转载)作者:中国电波传播研究所 郎锐■来自:yesky 摘要: 多线程同步技术是计算机软件开发的重要技术,本文对多线程的各种同步技术的原理和实现进行了初步探讨。 正文 临界区
管理事件内核对象
在创建线程前,首先创建一个可以自动复位的事件内核对象hEvent,而线程函数则通过WaitForSingleObject()等待函数无限等待 hEvent的置位,只有在事件置位时WaitForSingleObject()才会返回,被保护的代码将得以执行。对于以自动复位方式创建的事件对象,在其置位后一被WaitForSingleObject()等待到就会立即复位,也就是说在执行ThreadProc12()中的受保护代码时,事件对象已经是复位状态的,这时即使有ThreadProc13()对CPU的抢占,也会由于WaitForSingleObject()没有hEvent的置位而不能继续执行,也就没有可能破坏受保护的共享资源。在ThreadProc12()中的处理完成后可以通过SetEvent()对hEvent的置位而允许ThreadProc13()对共享资源g_cArray的处理。这里SetEvent()所起的作用可以看作是对某项特定任务完成的通知。 使用临界区只能同步同一进程中的线程,而使用事件内核对象则可以对进程外的线程进行同步,其前提是得到对此事件对象的访问权。可以通过OpenEvent()函数获取得到,其函数原型为:
如果事件对象已创建(在创建事件时需要指定事件名),函数将返回指定事件的句柄。对于那些在创建事件时没有指定事件名的事件内核对象,可以通过使用内核对象的继承性或是调用DuplicateHandle()函数来调用CreateEvent()以获得对指定事件对象的访问权。在获取到访问权后所进行的同步操作与在同一个进程中所进行的线程同步操作是一样的。 如果需要在一个线程中等待多个事件,则用 WaitForMultipleObjects()来等待。WaitForMultipleObjects()与WaitForSingleObject ()类似,同时监视位于句柄数组中的所有句柄。这些被监视对象的句柄享有平等的优先权,任何一个句柄都不可能比其他句柄具有更高的优先权。 WaitForMultipleObjects()的函数原型为:
参数nCount指定了要等待的内核对象的数目,存放这些内核对象的数组由lpHandles来指向。fWaitAll对指定的这nCount个内核对象的两种等待方式进行了指定,为TRUE时当所有对象都被通知时函数才会返回,为FALSE则只要其中任何一个得到通知就可以返回。 dwMilliseconds在这里的作用与在WaitForSingleObject()中的作用是完全一致的。如果等待超时,函数将返回 WAIT_TIMEOUT。如果返回WAIT_OBJECT_0到WAIT_OBJECT_0+nCount-1中的某个值,则说明所有指定对象的状态均为已通知状态(当fWaitAll为TRUE时)或是用以减去WAIT_OBJECT_0而得到发生通知的对象的索引(当fWaitAll为FALSE 时)。如果返回值在WAIT_ABANDONED_0与WAIT_ABANDONED_0+nCount-1之间,则表示所有指定对象的状态均为已通知,且其中至少有一个对象是被丢弃的互斥对象(当fWaitAll为TRUE时),或是用以减去WAIT_OBJECT_0表示一个等待正常结束的互斥对象的索引(当fWaitAll为FALSE时)。下面给出的代码主要展示了对WaitForMultipleObjects()函数的使用。通过对两个事件内核对象的等待来控制线程任务的执行与中途退出:
MFC为事件相关处理也提供了一个CEvent类,共包含有除构造函数外的4个成员函数PulseEvent()、ResetEvent()、 SetEvent()和UnLock()。在功能上分别相当与Win32 API的PulseEvent()、ResetEvent()、SetEvent()和CloseHandle()等函数。而构造函数则履行了原 CreateEvent()函数创建事件对象的职责,其函数原型为:
按照此缺省设置将创建一个自动复位、初始状态为复位状态的没有名字的事件对象。封装后的CEvent类使用起来更加方便,图2即展示了CEvent类对A、B两线程的同步过程: ![]() 图2 CEvent类对线程的同步过程示意 B线程在执行到CEvent类成员函数Lock()时将会发生阻塞,而A线程此时则可以在没有B线程干扰的情况下对共享资源进行处理,并在处理完成后通过成员函数SetEvent()向B发出事件,使其被释放,得以对A先前已处理完毕的共享资源进行操作。可见,使用CEvent类对线程的同步方法与通过 API函数进行线程同步的处理方法是基本一致的。前面的API处理代码可用CEvent类将其改写为:
信号量(Semaphore)内核对象对线程的同步方式与前面几种方法不同,它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用 CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过 ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。 ![]() 图3 使用信号量对象控制资源 下面结合图例3来演示信号量对象对资源的控制。在图3中,以箭头和白色箭头表示共享资源所允许的最大资源计数和当前可用资源计数。初始如图(a)所示,最大资源计数和当前可用资源计数均为4,此后每增加一个对资源进行访问的线程(用黑色箭头表示)当前资源计数就会相应减1,图(b)即表示的在3个线程对共享资源进行访问时的状态。当进入线程数达到4个时,将如图(c)所示,此时已达到最大资源计数,而当前可用资源计数也已减到0,其他线程无法对共享资源进行访问。在当前占有资源的线程处理完毕而退出后,将会释放出空间,图(d)已有两个线程退出对资源的占有,当前可用计数为2,可以再允许2个线程进入到对资源的处理。可以看出,信号量是通过计数来对线程访问资源进行控制的,而实际上信号量确实也被称作Dijkstra计数器。 使用信号量内核对象进行线程同步主要会用到CreateSemaphore()、OpenSemaphore()、ReleaseSemaphore()、 WaitForSingleObject()和WaitForMultipleObjects()等函数。其中,CreateSemaphore()用来创建一个信号量内核对象,其函数原型为:
参数lMaximumCount是一个有符号32位值,定义了允许的最大资源计数,最大取值不能超过4294967295。lpName参数可以为创建的信号量定义一个名字,由于其创建的是一个内核对象,因此在其他进程中可以通过该名字而得到此信号量。OpenSemaphore()函数即可用来根据信号量名打开在其他进程中创建的信号量,函数原型如下:
在线程离开对共享资源的处理时,必须通过ReleaseSemaphore()来增加当前可用资源计数。否则将会出现当前正在处理共享资源的实际线程数并没有达到要限制的数值,而其他线程却因为当前可用资源计数为0而仍无法进入的情况。ReleaseSemaphore()的函数原型为:
该函数将lReleaseCount中的值添加给信号量的当前资源计数,一般将lReleaseCount设置为1,如果需要也可以设置其他的值。 WaitForSingleObject()和WaitForMultipleObjects()主要用在试图进入共享资源的线程函数入口处,主要用来判断信号量的当前可用资源计数是否允许本线程的进入。只有在当前可用资源计数值大于0时,被监视的信号量内核对象才会得到通知。 信号量的使用特点使其更适用于对Socket(套接字)程序中线程的同步。例如,网络上的HTTP服务器要对同一时间内访问同一页面的用户数加以限制,这时可以为没一个用户对服务器的页面请求设置一个线程,而页面则是待保护的共享资源,通过使用信号量对线程的同步作用可以确保在任一时刻无论有多少用户对某一页面进行访问,只有不大于设定的最大用户数目的线程能够进行访问,而其他的访问企图则被挂起,只有在有用户退出对此页面的访问后才有可能进入。下面给出的示例代码即展示了类似的处理过程:
![]() 图4 开始进入的两个线程 ![]() 图5 线程二退出后线程三才得以进入 上述代码在开启线程前首先创建了一个初始计数和最大资源计数均为2的信号量对象hSemaphore。即在同一时刻只允许2个线程进入由 hSemaphore保护的共享资源。随后开启的三个线程均试图访问此共享资源,在前两个线程试图访问共享资源时,由于hSemaphore的当前可用资源计数分别为2和1,此时的hSemaphore是可以得到通知的,也就是说位于线程入口处的WaitForSingleObject()将立即返回,而在前两个线程进入到保护区域后,hSemaphore的当前资源计数减少到0,hSemaphore将不再得到通知, WaitForSingleObject()将线程挂起。直到此前进入到保护区的线程退出后才能得以进入。图4和图5为上述代脉的运行结果。从实验结果可以看出,信号量始终保持了同一时刻不超过2个线程的进入。 在MFC中,通过CSemaphore类对信号量作了表述。该类只具有一个构造函数,可以构造一个信号量对象,并对初始资源计数、最大资源计数、对象名和安全属性等进行初始化,其原型如下:
在构造了CSemaphore类对象后,任何一个访问受保护共享资源的线程都必须通过CSemaphore从父类CSyncObject类继承得到的 Lock()和UnLock()成员函数来访问或释放CSemaphore对象。与前面介绍的几种通过MFC类保持线程同步的方法类似,通过 CSemaphore类也可以将前面的线程同步代码进行改写,这两种使用信号量的线程同步方法无论是在实现原理上还是从实现结果上都是完全一致的。下面给出经MFC改写后的信号量线程同步代码:
互斥(Mutex)是一种用途非常广泛的内核对象。能够保证多个线程对同一共享资源的互斥访问。同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。与其他几种内核对象不同,互斥对象在操作系统中拥有特殊代码,并由操作系统来管理,操作系统甚至还允许其进行一些其他内核对象所不能进行的非常规操作。为便于理解,可参照图6给出的互斥内核对象的工作模型: ![]() 图6 使用互斥内核对象对共享资源的保护 图(a)中的箭头为要访问资源(矩形框)的线程,但只有第二个线程拥有互斥对象(黑点)并得以进入到共享资源,而其他线程则会被排斥在外(如图(b)所示)。当此线程处理完共享资源并准备离开此区域时将把其所拥有的互斥对象交出(如图(c)所示),其他任何一个试图访问此资源的线程都有机会得到此互斥对象。 以互斥内核对象来保持线程同步可能用到的函数主要有CreateMutex()、OpenMutex()、 ReleaseMutex()、WaitForSingleObject()和WaitForMultipleObjects()等。在使用互斥对象前,首先要通过CreateMutex()或OpenMutex()创建或打开一个互斥对象。CreateMutex()函数原型为:
参数bInitialOwner主要用来控制互斥对象的初始状态。一般多将其设置为FALSE,以表明互斥对象在创建时并没有为任何线程所占有。如果在创建互斥对象时指定了对象名,那么可以在本进程其他地方或是在其他进程通过OpenMutex()函数得到此互斥对象的句柄。OpenMutex()函数原型为:
当目前对资源具有访问权的线程不再需要访问此资源而要离开时,必须通过ReleaseMutex()函数来释放其拥有的互斥对象,其函数原型为:
其唯一的参数hMutex为待释放的互斥对象句柄。至于WaitForSingleObject()和WaitForMultipleObjects()等待函数在互斥对象保持线程同步中所起的作用与在其他内核对象中的作用是基本一致的,也是等待互斥内核对象的通知。但是这里需要特别指出的是:在互斥对象通知引起调用等待函数返回时,等待函数的返回值不再是通常的WAIT_OBJECT_0(对于WaitForSingleObject()函数)或是在 WAIT_OBJECT_0到WAIT_OBJECT_0+nCount-1之间的一个值(对于WaitForMultipleObjects()函数),而是将返回一个WAIT_ABANDONED_0(对于WaitForSingleObject()函数)或是在WAIT_ABANDONED_0 到WAIT_ABANDONED_0+nCount-1之间的一个值(对于WaitForMultipleObjects()函数)。以此来表明线程正在等待的互斥对象由另外一个线程所拥有,而此线程却在使用完共享资源前就已经终止。除此之外,使用互斥对象的方法在等待线程的可调度性上同使用其他几种内核对象的方法也有所不同,其他内核对象在没有得到通知时,受调用等待函数的作用,线程将会挂起,同时失去可调度性,而使用互斥的方法却可以在等待的同时仍具有可调度性,这也正是互斥对象所能完成的非常规操作之一。 在编写程序时,互斥对象多用在对那些为多个线程所访问的内存块的保护上,可以确保任何线程在处理此内存块时都对其拥有可靠的独占访问权。下面给出的示例代码即通过互斥内核对象hMutex对共享内存快g_cArray[]进行线程的独占访问保护。下面给出实现代码清单:
互斥对象在MFC中通过CMutex类进行表述。使用CMutex类的方法非常简单,在构造CMutex类对象的同时可以指明待查询的互斥对象的名字,在构造函数返回后即可访问此互斥变量。CMutex类也是只含有构造函数这唯一的成员函数,当完成对互斥对象保护资源的访问后,可通过调用从父类 CSyncObject继承的UnLock()函数完成对互斥对象的释放。CMutex类构造函数原型为:
该类的适用范围和实现原理与API方式创建的互斥内核对象是完全类似的,但要简洁的多,下面给出就是对前面的示例代码经CMutex类改写后的程序实现清单:
小结 线程的使用使程序处理更够更加灵活,而这种灵活同样也会带来各种不确定性的可能。尤其是在多个线程对同一公共变量进行访问时。虽然未使用线程同步的程序代码在逻辑上或许没有什么问题,但为了确保程序的正确、可靠运行,必须在适当的场合采取线程同步措施。 二进制格雷码与自然二进制码的互换二进制格雷码与自然二进制码的互换2006年03月19日, by mathon
二进制格雷码与自然二进制码的互换 示例工程下载
二、二进制格雷码与自然二进制码的互换 1、自然二进制码转换成二进制格雷码 自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。 ![]() 2、二进制格雷码转换成自然二进制码 二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。 ![]() 三、二进制格雷码与自然二进制码互换的实现方法 1、自然二进制码转换成二进制格雷码 A)、软件实现法(参见示例工程中的 Binary to Gray) 根据自然二进制转换成格雷码的法则,可以得到以下的代码: static unsigned int DecimaltoGray(unsigned int x)
{
return x^(x>>1);
}
//以上代码实现了unsigned int型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。
static int DecimaltoGray( int x)
{
return x^(x>>1);
}
//以上代码实现了 int型数据到格雷码的转换,最高可转换31位自然二进制码,超出31位将溢出。
上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。
B)、硬件实现法 根据自然二进制转换成格雷码的法则,可以得到以下电路图: 上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。 2、二进制格雷码转换成自然二进制码 A)、软件实现法(参见示例工程中的 Gray to Binary ) 根据二进制格雷码转换成自然二进制码的法则,可以得到以下的三种代码方式:
//以上代码实现了unsigned int型数据到自然二进制码的转换,最高可转换32位格雷码,超出32位将溢出。将数据类型改为int型即可实现31位格雷码转换。
上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。
B)、硬件实现法
根据二进制格雷码转换成自然二进制码的法则,可以得到以下电路图:
上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。 最近不能写BLOG?怎么好像到今天才能上嘛。。。最近比较忙,唉~~ 要实习了考试前天终于考完了,晚上全班聚了聚,夜里去飙歌,真热闹。前所未有,聚餐来了28个,飙歌来了27个!!
马上要实习了,还不知道是个什么样子,最近忙死了,还要回家一趟。据说宿舍东西要搬完。。。。汗~~什么学校啊
招聘会今天本部招聘会,投了3家公司,新宇,神游,苏州软件评测公司。实在太挤了~~我这个专业去投简历让别人感到很奇怪,别人尴尬,我也尴尬
不知结果如何~~心里没底 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|