怎么样使程序交出控制权

作者&投稿:罗翁 (若有异议请与网页底部的电邮联系)
什么叫做任务的优先权?~

我们一般说是抢先式多任务和协作式多任务. 因为这是操作系统的事, 所以不能举程序例子. 举操作系统的例子, Windows 3.1是协作式多任务的, 而Windows 2000就是抢先式多任务的操作系统.

像Windows这样的操作系统是多任务的你应该理解了吧, 其实就是可以多个程序一起执行. 那么系统怎么分配它们, 在某一个时刻该哪个程序运行呢?

协作式多任务(比如老的Windows 3.1)是某一个程序在完成一个任务后自动把程序控制权交给系统. 别的程序处理完自己的事性后也把控制权交给操作系统. 这样操作系统就可以轮流在各个程序间切换了. 这最大的一个问题就是, 如果某个程序没有交出控制权, 系统就不能正常运转了. 一个程序没有交出控制权, 有两种情况: 一个是该程序不想交出(一般只要不是恶意的程序, 谁也不会这样吧?), 另一个是该程序出现故障. 所以这种协作式的多任务只要有一个程序"死机", 整个系统就都"死"了, 只能重起.

它要求每个程序都得是 "守法公民", 即, 都得有协作精神, 系统才能正常运转.

但抢先式多任务就不是这样了, 系统会强制在各程序之间进行切换. 所以一个程序如果死机了, 你只要把它关闭就可以了, 对其它程序, 以及整个系统, 通常不会造成影响.

所以 "抢先", 是指操作系统可以抢在应用程序之先去处理事务, 所以可以不受单个程序的影响.

可以举个编写程序的例子, 每个Windows程序都有一个主循环, 如:

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;

它就可以实现协作. 调用GetMessage时就把控制权交给了Windows. 所以在编写复杂的程序时别忘了这个循环, 它通常是在主程序中, 但如果你有很耗时的操作, 就应该自己在这个耗时的操作中加入类似的循环. 如果在Windows3.1中不用这个循环, 就死机了. 而在抢先式多任务的环境中, 你不用这个循环, 你的程序是"死"的, 整个系统不会"死"

我们一般说是抢先式多任务和协作式多任务. 因为这是操作系统的事, 所以不能举程序例子. 举操作系统的例子, Windows 3.1是协作式多任务的, 而Windows 2000就是抢先式多任务的操作系统.

像Windows这样的操作系统是多任务的你应该理解了吧, 其实就是可以多个程序一起执行. 那么系统怎么分配它们, 在某一个时刻该哪个程序运行呢?

协作式多任务(比如老的Windows 3.1)是某一个程序在完成一个任务后自动把程序控制权交给系统. 别的程序处理完自己的事性后也把控制权交给操作系统. 这样操作系统就可以轮流在各个程序间切换了. 这最大的一个问题就是, 如果某个程序没有交出控制权, 系统就不能正常运转了. 一个程序没有交出控制权, 有两种情况: 一个是该程序不想交出(一般只要不是恶意的程序, 谁也不会这样吧?), 另一个是该程序出现故障. 所以这种协作式的多任务只要有一个程序"死机", 整个系统就都"死"了, 只能重起.

它要求每个程序都得是 "守法公民", 即, 都得有协作精神, 系统才能正常运转.

但抢先式多任务就不是这样了, 系统会强制在各程序之间进行切换. 所以一个程序如果死机了, 你只要把它关闭就可以了, 对其它程序, 以及整个系统, 通常不会造成影响.

所以 "抢先", 是指操作系统可以抢在应用程序之先去处理事务, 所以可以不受单个程序的影响.

可以举个编写程序的例子, 每个Windows程序都有一个主循环, 如:

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;

它就可以实现协作. 调用GetMessage时就把控制权交给了Windows. 所以在编写复杂的程序时别忘了这个循环, 它通常是在主程序中, 但如果你有很耗时的操作, 就应该自己在这个耗时的操作中加入类似的循环. 如果在Windows3.1中不用这个循环, 就死机了. 而在抢先式多任务的环境中, 你不用这个循环, 你的程序是"死"的, 整个系统不会"死"

什么语句的作用是暂时停止VB程序的运行,将控制权转交给操作系统
doevents

-------------------

在程序中 有一部分代码 需要处理较长的一段时间(不在循环中),使得程序不能做别的操作。请问怎么样使程序交出控制权,进行别的操作?(C# WinForm

线程

-------------------

VC消息篇

消息的概念可以这样说“在WINDOWS环境中,消息是指从WINDOWS调用的函数传递给应用程序出口函数的固定不变的数据集。”(见书《Microsoft Windows 3 Developer''s Workshop》,Microsoft press,Richard Wilton)。学过SDK编程的人,看到这些话会很清楚的就知道了消息的概念。
如果这个概念看不懂的话,我们可以从另外一个角度来说,先说一点有关与消息的知识,这个很重要,WINDOWS系统中有一个消息系统,有且只有一个,还有很多个消息队列,消息系统能接受到所有的消息,并且它还能够把这个消息发给任何应用程序,应用程序一旦接收到消息(当然应用程序之间也能互相发送消息),如果要对这个消息处理的话,就要对这个消息进行处理,不同的消息会有不同的处理,比如,WM_PAINT消息会通知应用程序要在显示器上输出东西。有些消息,你需要添加另外的程序代码来处理,有些消息,你在VC编程的时候,所产生的程序框架就已经能对它进行处理了,你没必要去写了。
比如,我们用VC建立了一个基本对话框的应用程序,上面有2个按钮,分别是BUTTONA和BUTTONB,点击BUTTONA后,BUTTONB就会隐藏掉。在编程的过程中,你就会对BUTTONA的BN_CLICKED事件进行编程,让BUTTONB隐藏掉,隐藏后上面就没有BUTTONB了,这儿会有一个WM_PAINT消息通知应用程序要重画应用程序的界面,以显示应用程序上面已经没有BUTTIONB按钮了,那个BN_CLICKED事件中就需要我们要添加另外的程序代码,这就是说,如果我们点击了BUTTONA按钮,消息系统就会接收到BN_CLICKED的消息,并且把它发送给我们建立的程序框架,然后执行我们添加的代码,而那个WM_PAINT事件就不用了,程序的框架会自动进行处理的,我们就不必去多费心了。
相信现在你应该对消息的概念有所了解了,如果还不了解的话,你可以到互联网上查找一些更好的文章,那对你会更有帮助的。

一、引言
随着Windows操作系统的不断推广,众多软件开发包都提供有开发基于Windows平台应用软件的功能。虽然这些开发包不尽相同,流行的有Visual C++、Visual Basic、Delphi、C++ Builder 等多种,但由这些不同语言开发的软件有一点却是相同的--都是运行于Windows 操作平台,都必须接受Windows 的运行机制。作为Windows 操作系统灵魂的消息机制也就必然为众多用不同语言开发的Windows操作系统下运行的应用程序所接受。因此,要编写深入的Windows程序,就必须对Windows的运行机制有很好的认识和理解。本文下面将对Windows操作系统下的消息运行机制做较为深入的剖析。
二、Windows事件驱动机制
我们当中不少使用VC、Delphi等作为开发语言的程序员是一步步从DOS下的Basic、C++中走过来的,而且大多在刚开始学习编程时也是先从DOS下的编程环境入手的,因此在习惯了DOS下的过程驱动形式的顺序程序设计方法后,往往在向Windows下的开发环境转型的过程中会对Windows所采取的事件驱动方式感到无法适应。因为DOS和Windows这两种操作系统的运行机制是截然不同的,DOS下的任何程序都是使用顺序的、过程驱动的程序设计方法。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员,在编写程序时,并不知道用户会先按下哪个按纽,也就不知道程序先触发哪个消息。因此我们的主要任务就是对正在开发的应用程序要发出的或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。
三、Windows的消息循环
Windows操作系统为每一个正在运行的应用程序保持有一个消息队列。当有事件发生后,Windows并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。应用程序需要通过消息循环来接收这些消息。在MFC中使用了对WinAPI进行了很好封装的类库,虽然可以为编程提供一个面向对象的界面,使Windows程序员能够以面象对象的方式进行编程,把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现,但是由于引入了很好的封装特性,使我们不能直接操纵部分核心代码。对于消息的循环和接收也只是通过类似于下面的消息映射予以很简单的表示:
BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)
//{{AFX_MSG_MAP(CTEMMSView)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_OPENDATA, OnOpenData)
ON_WM_TIMER()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
虽然上述消息映射在编程过程中处理消息非常简练方便,但显然是难于理解消息是如何参与循环和分发的。因此有必要通过SDK(Software Developers Kit,软件开发工具箱)代码深入到被MFC封装的Windows编程的核心中来研究其具体是如何工作的。在SDK编程中,一般是在Windows应用程序的入口点WinMain函数中添加处理消息循环的代码以检索Windows送来的消息,然后WinMain再把这些消息分配给相应的窗口函数并处理它们:
……
MSG msg; //定义消息名
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ; //翻译消息
DispatchMessage (&msg) ; //撤去消息
}
return msg.wParam ;
上述几句虽然简单但却是所有Windows程序的关键代码,担负着获取、解释和分发消息的任务,下面就重点对其功能和作用进行分析:
MSG结构在头文件中定义如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
其数据成员的具体意义如下:
hwnd:消息将要发送到的那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息。
message:消息号,它唯一标识了一种消息类型。每种消息类型都在Windows文件进行了预定义。
wParam:一个32位的消息参数,这个值的确切意义取决于消息本身。
lParam:同上。
time:消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值。Windows用
这个域来使用消息保持正确的顺序。
pt:消息放入消息队列时的鼠标坐标。
消息循环以GetMessage调用开始,它从消息队列中取出一个消息。该函数的四个参数可以有控制地获取消息,第一个参数指定要接收消息的MSG结构的地址,第二个参数表示窗口句柄,一般将其设置为空,表示要获取该应用程序创建的所有窗口的消息;第三、四参数用于指定消息范围。后面三个参数被设置为默认值,用于接收发送到属于这个应用程序的任何一个窗口的所有消息。在接收到除WM_QUIT之外的任何一个消息后,GetMessage()返回TRUE;如果GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。当除WM_QUIT的消息用GetMessage读入后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。这里起关键作用的是DispatchMessage()函数,把由GetMessage获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。
由于Windows操作系统是一种非剥夺式多任务操作系统。只有在应用程序主动交出CPU控制权后,Windows才能把控制权交给其他应用程序。在消息循环中,一定要有能交出控制的系统函数才能实现协同式多任务操作。能完成该功能的只有GetMessage、PeekMessage和WaitMessage这三个函数,如果在应用程序中长期不去调用这三个函数之一其他任务则无法执行。GetMessage函数在找不到等待应用程序处理的消息时,会自动交出控制权,由Windows把CPU的控制权交给其他等待获取控制权的应用程序。由于任何Windows应用程序都含有一个消息循环,这种隐式交出控制权的方式可以保证合并各个应用程序共享控制权。一旦发往该应用程序的消息到达应用程序队列,即开始执行GetMessage语句的下一条语句。使用GetMessage函数的消息循环在消息队列中没有消息时将等待,如果需要,可以利用这段时间进行I/O端口操作等耗时操作,不过需要在消息循环中使用PeekMessage函数来代替GetMessage。使用PeekMessage的方法同GetMessage类似,下面是一段使用PeekMessage函数的消息循环的典型例子:
MSG msg;
BOOL bDone=FALSE;
do{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT)
bDone=TRUE;
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//无消息处理,进行长时间操作
else{
……//长时间操作
}
}while(!bDone)
……
无论应用程序消息队列中是否有消息,PeekMessage函数都立即返回,如果希望等待新消息入队,可以利用无返回值的函数WaitMessage配合PeekMessage进行消息循环。
四、对Windowds消息的处理
窗口过程处理消息通常以switch语句开始,对于它要处理的每一条消息ID都跟有一条case语句,这在功能上同MFC的消息映射有些类似:
switch(uMsgId)
{
case WM_TIMER:
//对WM_TIMER定时器消息的处理过程
return 0;
case WM_LBUTTONDOWN:
//对WM_ LBUTTONDOWN鼠标左键单击消息的处理过程
ruturn 0;
……
default:
//其他消息由这个默认处理函数来处理
return DefWindowProc(hwnd,uMsgId,wParam,lParam);
}
在处理完消息后必须返回0,这很重要,否则Windows将要不停地重试下去。对于那些在程序中不准备处理的消息,窗口过程会把它们都扔给DefWindowProc进行缺省处理,而且还要返回那个函数的返回值。在消息传递层次中,可以认为DefWindowProc函数是最顶层的函数。该函数发出WM_SYSCOMMAND消息,由系统执行Windows环境中多数窗口所公用的各种通用操作,如更新窗口的正文标题等等。 在MFC下可以用下述部分代码实现与上述SDK代码相同的功能:
BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)
//{{AFX_MSG_MAP(CTEMMSView)
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
小结:Windows环境提供有非常丰富的系统资源,在这个基础上可以编制出能满足各种各样目标功能的应用系统。要深入Windows编程就必须首先对Windows系统的运行机理有很好的认识,本文仅针对Windows的一种重要运行机制--消息机制作了较深入的剖析和阐述。对培养在Windows下的编程思想有一定的帮助。对某些相关问题的详细论述可以参考MSDN在线帮助的"SDK Reference"部分。


怎么样使程序交出控制权
答:`DoEvents` 语句的作用是暂时停止 VB 程序的运行,将控制权转交给操作系统。2. 在程序中有一部分代码需要处理较长时间的一段时间(不在循环中),使得程序不能做别的操作。请问怎么样使程序交出控制权,进行别的操作?答:可以通过调用 `DoEvents` 语句或者使用其他线程(例如,使用 C# 的 `Sy...

电路板上的Tⅴ一cⅴBS代表什么?
主设备可以对总线有控制权,从设备响应从主设备发来的总线命令。 总线判优控制可以分为两种:集中式和分布式。下面介绍几种集中式的总线判优控制结构。 主设备通过BR申请总线的控制权,有设备在使用总线,则设置BS。总线控制部件通过BG来链式查询这些接口是否提出了BR,遇到了BR则交出控制权。 因此,优先顺序则为BG的查询...

程序设计中的指令是什么?有哪几种?
使用PowerBuilder,可以很容易地开发出功能强大的图形界面的访问服务器数据库的应用程序,PowerBuilder提供了建立符合工业标准的应用程序(例如订单登记、会计及制造系统)所需的所有工具。 PowerBuilder应用程序由窗口组成,这些窗口包含用户与之交互的控件。开发人员可以使用所有标准空间(如按钮、复选框、下拉式列表框或编辑框...

如何不让电子眼抓拍大解密
图3给出个位的计时显示控制程序流程。 图3 个位的计时显示控制程序流程 注意:数码管的时间显示间隔应与摄像机的拍摄速度相匹配,即要求曝光时间小于时间分辨率。如为了获得1 ms的延时测量分辨率,应将电子警察的快门速度控制在1\/l 000 s以下;若快门速度为1\/500 s,时间分辨率只能达到2 ms。若两者不匹配,曝光时间大于...

给文件加壳,加花,去壳,分别是什么意思?
加壳:其实是利用特殊的算法,对可执行文件里的资源进行压缩,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。附加在原程序上通过加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分...

控制器的主要功能是什么?
1,控制机器,控制各个部件协调一致地工作。2,控制器具备数据交换功能,这是指实现CPU与控制器之间、控制器与设备之间的数据交换。3,将电话比喻中人体,那么控制器就好比是人的大脑,输出各种指令,是零件灵活运行。4,运算器只能完成运算,而控制器用于控制着整个CPU的工作。5,通过数据总线,由CPU并行...

怎么样可以控制机器每天执行程序的时间
自己写代码。。。用监视器,发现执行时立马杀掉,表面上看来好像就没有打开一样。或是自己写一个类仿任务管理器的。

计算机C语言有什么用啊??
2、C语言是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。3、C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。4...

操作系统的五大类型是什么?
2、分时操作系统 分时操作系统是使一台计算机采用时间片轮转的方式同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样...

计算机是怎么工作的?
通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。程序与数据一样存取,按程序编排的顺序,一步一步地取出指令。

楚雄彝族自治州19512785470: 如何暂停一个程序并继续? 即: 如何把“控制权”交给系统并重新获得? -
祗梦双迪: 最简单的是将过程放入线程,然后 pause ,resume 就可以了.

楚雄彝族自治州19512785470: 在C语言中,()函数使程序立即终止,控制权传回给操作系统()?A,exit() B,return C,continue -
祗梦双迪: A

楚雄彝族自治州19512785470: 在VB中如何实现延时把主控权转让给别的程序 -
祗梦双迪: 用DoEvents语句 DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0. DoEvents 会将控制权传给操作系统.当操作系统处理完队列中的事...

楚雄彝族自治州19512785470: bootloader如何将控制权交给内核 -
祗梦双迪: bootloader 完成之后PC指针跳到主程序入口处,接下来就可运行主程序

楚雄彝族自治州19512785470: 怎样通过远程控制用本机上的软件安装包将软件装在其它电脑上 -
祗梦双迪: 然后释放控制权.让你控制对方电脑.把自己电脑上的软件安装包先复制到对方电脑上的某一个盘,从对方电脑打开安装包.这样就可以了.

楚雄彝族自治州19512785470: VB程序中DoEvents()是什么意思? -
祗梦双迪: DoEvents 函数 转让控制权,以便让操作系统处理其它的事件 因为vb是单线程的东东,所以在适当的时候需要加上DoEvents 函数 转让控制权,以便让操作系统处理其它的事件 DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中...

楚雄彝族自治州19512785470: 开机时计算机执行每一步的动作顺序是怎样的? -
祗梦双迪: 第一步:按下电源开关后,到启动Windows XP之前的这段时间称为预引导阶段.首先计算机会运行自检过程,也就是POST(Power On Self Test,开机自检),检测项目包括内存大小和其他硬件设备的状况,在启动时的能源之星画面中的大堆参...

楚雄彝族自治州19512785470: 我的系统只有users账户了,管理员账户被禁用了,要怎么才能取的控制权 -
祗梦双迪: 解决方法1:开机自检后按F8键,在“Windows 高级选项”菜单上选择“安全模式”;.以 Administrator身份登录.如果系统提示,在“为什么计算机意外关闭”列表中单击以选择一项,然后单击“确定”;在“我的电脑”上点右键选择“管理...

楚雄彝族自治州19512785470: 什么叫加壳?什么叫脱壳?怎样加壳?怎样脱壳? -
祗梦双迪: 加壳一般是指保护程序资源的方法. 脱壳一般是指除掉程序的保护,用来修改程序资源. 病毒加壳技术与脱壳杀毒方法 : 壳是什么?脱壳又是什么?这是很多经常感到迷惑和经常提出的问题,其实这个问题一点也不幼稚.当你想听说脱壳这个名...

楚雄彝族自治州19512785470: i/o的控制方式 -
祗梦双迪: CPU通过接口对外设进行控制的方式有以下几种:(1)程序查询方式 这种方式下,CPU通过I/O指令询问指定外设当前的状态,如果外设准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询.这种方式的优点是结构简单,只需要少...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网