一个多线程的windows控制台应用程序

一个多线程的windows控制台应用程序
一个多线程的windows控制台应用程序

一个多线程的windows控制台应用程序

一、要求:

编写一个单进程、多线程的windows控制台应用程序。

二、平台:

Window XP

C#

三、内容:

每个进程都有分配给它的一个或多个线程。线程是一个程序的执行部分。

操作系统把极短的一段时间轮流分配给多个线程。时间段的长度依赖于操作系统和处理器。

每个进程都开始一个默认的线程,但是能从它的线程池中创建一个新的线程。

线程是允许进行并行计算的一个抽象概念:在一个线程完成计算任务的同时,另一个线程可以对图像进行更新,两个线程可同时处理同一个进程发出的两个网络请求。

如图所示,选择操作:

1、创建和启动一个线程。在一个进程中同时教和运行两个线程,并且可以不需要停止或者释放一个线程。

相关代码及其解释:

public class Threading1:Object

{

public static void startup()

{

//创建一个线程数组

Thread[] threads=new Thread[2];

for(int count=0;count

{

//创建线程

threads[count]=new Thread(new ThreadStart(Count));

//启动线程

threads[count].Start();

}

public static void Count()

{

for(int count=1;count<=9;count++)

Console.Write(count+" ");

}

}

输出结果:

这里通过new方法创建了两个线程,然后使用start()方法来启动线程,两个线程的作用是:两个线程同时从1数到9,并将结果打印出来。

运行上面的程序代码时,可能会在控制台上输出多种不同的结果。从123456789123456789到112233445566778899或121233445566778989在内的各种情况都是可能出现的,输出结果可能与操作系统的调度方式有关。

2、停止线程。当创建一个线程后,可以通过多种属性方法判断该线程是否处于活动状态,启动和停止一个线程等。相关代码及其解释:

public class MyAlpha

{

//下面创建的方法是在线程启动的时候的时候调用

public void Beta()

{

while(true)

{

Console.WriteLine("MyAlpha.Beta is running in its own thread.");

}

}

}

public class Simple

{

public static int Stop()

{

Console.WriteLine("Thread Start/Stop/Join");

MyAlpha TestAlpha=new MyAlpha();

//创建一个线程对象

Thread MyThread=new Thread(new ThreadStart(TestAlpha.Beta));

//开起一个线程

MyThread.Start();

while(!MyThread.IsAlive);

Thread.Sleep(1);

//停止线程

MyThread.Abort();

//加入一个线程

MyThread.Join();

Console.WriteLine();

Console.WriteLine("TestAlpha.Beta has finished");

//进行异常处理

try

{

Console.WriteLine("Try to restart the TestAlpha.Beta thread");

MyThread.Start();

}

catch(ThreadStateException)

{

Console.WriteLine("ThreadStateException trying to restart TestAlpha.Beta.");

Console.WriteLine("Expected since aborted threads cannot be restarted.");

}

return 0;

}

}

输出结果:

3、进程的同步

为了保证数据结构的稳定,必须通过使用锁来调整两个线程的操作顺序。这里通过对引用的对象申请一个锁,一旦一段程序获得该锁的控制权后,就可以保证只有它获得了这个锁并能够对该对象进行操作。同样,利用这种锁,一个线程可以一直处于等待状态,直到有能够唤醒他的信号通过变量传来为止。

相关代码及其解释:

public class Monitor1

{

public static void Synchronize()

{

int result=0; //Result initialized to say there is no error

Cell cell=new Cell();

CellProd prod=new CellProd(cell,20);

CellCons cons=new CellCons(cell,20);

Thread producer=new Thread(new ThreadStart(prod.ThreadRun));

Thread consumer=new Thread(new ThreadStart(cons.ThreadRun));

try

{

producer.Start();

consumer.Start();

//启动两个线程

producer.Join();

consumer.Join();

//将线程producer和consumer加入,此时两个线程贻初始化完成}

catch(ThreadStateException e)

{

Console.WriteLine(e);

result=1;

}

catch(ThreadInterruptedException e)

{

Console.WriteLine(e);

result=1;

}

//进行异常处理

Environment.ExitCode=result;

}

}

public class CellProd

{

Cell cell;

int quantity=1;

public CellProd(Cell box,int request)

{

cell=box;

quantity=request;

}

public void ThreadRun()

{

for(int looper=1;looper<=quantity;looper++)

cell.WriteToCell(looper);

}

}

public class CellCons

{

Cell cell;

int quantity=1;

public CellCons(Cell box,int request)

cell=box;

quantity=request;

}

public void ThreadRun()

{

int valReturned;

for(int looper=1;looper<=quantity;looper++)

valReturned=cell.ReadFromCell();

}

}

public class Cell

{

int cellContents;

bool readerFlag=false;

public int ReadFromCell()

{

lock(this)

{

//使用lock命令来进入线程同步块

if(!readerFlag)

{

//等待Cell.WriteToCell处理完毕

try

{

//等待Monitor.Pulse在WriteToCell进行处理

Monitor.Wait(this);

}

catch(SynchronizationLockException e)

{

Console.WriteLine(e);

}

catch(ThreadInterruptedException e)

{

Console.WriteLine(e);

}

}

Console.WriteLine("Consume:{0}",cellContents);

readerFlag=false;

Monitor.Pulse(this);

}

//推出线程同步块

return cellContents;

}

public void WriteToCell(int n)

lock(this)

//使用lock命令来进入线程同步块

{

if(readerFlag)

{

//等待Cell.ReadFromCell处理完毕

try

{

Monitor.Wait(this);

//等待Monitor.Pulse在WriteToCell在ReadFromCell进行处理

}

catch(SynchronizationLockException e)

{

Console.WriteLine(e);

}

catch(ThreadInterruptedException e)

{

Console.WriteLine(e);

}

}

cellContents=n;

Console.WriteLine("Produce:{0}",cellContents);

readerFlag=true;

//退出线程同步块

Monitor.Pulse(this);

}

}

}

输出结果:

。。。

。。。

为了保证多线程同步,主要运用了以下几种方法:

(1)、lock

多线程同步的关键是当一个线程正在执行某段共享代码或者正在使用某个共享资源时,其他线程不能同时进入,而需要等待前一个线程退出。实现这个功能的最直接的方法就是加锁。

C#中的lock命令来实现该功能。

(2)、Monitor.Wait(object obj)

C#中如果要等待一个信号,则需要用System.Threading.Monitor类,这个方法需要在同步的程序段内执行。

使用System.Threading.Monitor类中的Pulse方法来通报在等待队列的一个线程。

4、线程池

如果许多利用了线程的应用软件都创建线程,这些线程将会因为等待某些条件(键盘或新的I/O输入等)而在等待状态中浪费了大部分的时间,C#中的System.Threading.ThreadPool对象可以解决这一问题。使用ThreadPool和事件驱动的编程机制,程序可以注册一个System.Threading.WaitHandle对象和System.Threading.WaitOrTimeCallback对象,所有的线程无需自己等待WaitHandle的释放,ThreadPool将监控所有向它注册的WaitHandle,然后再WaitHandle被释放后调用相应Threading.WaitOrTimeCallback对象的方法。

相关代码及其解释:

public class MySomeST

{

public int MyCook;

public MySomeST(int iMyCook)

{

MyCook=iMyCook;

}

}

public class MyAlpha1

{

public Hashtable HashCount;

public ManualResetEvent eventX;

public static int iCount=0;

public static int iMaxCount=0;

public MyAlpha1(int MaxCount)

{

HashCount=new Hashtable(MaxCount);

iMaxCount=MaxCount;

}

public void MyBeta(object state)

{

Console.WriteLine("{0} {1}:",Thread.CurrentThread.GetHashCode(),((MySomeST)state).MyCook);

Console.WriteLine("HashCount.Count=={0},Thread.CurrentThread.GetHashCode()=={1}",HashCount.Count,Thread.CurrentThre ad.GetHashCode());

lock(HashCount)

{

if(!HashCount.ContainsKey(Thread.CurrentThread.GetHashCode()))

HashCount.Add(Thread.CurrentThread.GetHashCode(),0);

HashCount[Thread.CurrentThread.GetHashCode()]=

((int)HashCount[Thread.CurrentThread.GetHashCode()])+1;

}

int iX=2000;

Thread.Sleep(iX);

Interlocked.Increment(ref iCount);

Console.WriteLine();

Console.WriteLine("Setting eventX ");

eventX.Set();

}

}

}

public class SimplePool

{

public static int Pool()

{

Console.WriteLine("Thread Pool:");

bool W2K=false;

int MaxCount=10;

ManualResetEvent eventX=new ManualResetEvent(false);

Console.WriteLine("Queuing {0} items to Thread Pool",MaxCount);

MyAlpha1 TestAlpha=new MyAlpha1(MaxCount);

TestAlpha.eventX=eventX;

Console.WriteLine("Queue to Thread Pool 0");

try

{

ThreadPool.QueueUserWorkItem(new WaitCallback(TestAlpha.MyBeta),new MySomeST(0));

W2K=true;

}

catch(NotSupportedException)

{

Console.WriteLine("These API's may fail when called on a non-Window 2000 system.");

W2K=false;

}

if(W2K)

{

for(int iItem=1;iItem

{

Console.WriteLine("Queue to ThreadPool {0}",iItem);

ThreadPool.QueueUserWorkItem(new WaitCallback(TestAlpha.MyBeta),new MySomeST(iItem));

}

Console.WriteLine("Waiting for Thread Pool to drain");

eventX.WaitOne(Timeout.Infinite,true);

Console.WriteLine("Thread Pool has been drained(Event fired)");

Console.WriteLine();

Console.WriteLine("Load across threads");

foreach(object o in TestAlpha.HashCount.Keys)

Console.WriteLine("{0} {1}",o,TestAlpha.HashCount[o]);

}

return 0;

}

。。。

。。。

上面的程序代码在不同的计算机上运行输出的结果可能不同。这是因为与操作系统的线程调度方式之间的差别有关。

四、总结

通过本次课程设计,对操作系统的多线程的相关知识有了更深的理解,并对C#程序设计有所掌握。

注:总的源代码在本文件夹下。

实验2-2windows2000 线程同步

实验2 并发与调度 2.2 Windows 2000线程同步 (实验估计时间:120分钟) 背景知识 实验目的 工具/准备工作 实验内容与步骤 背景知识 Windows 2000提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互锁数据、临界段、事件、互斥体和信号等。 多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。 在进程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制 (见表4-1) 。 而互斥体则是另一个可命名且安全的内核对象,其主要目的是引导对共享资源的访问。拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际执行操作之前获得互斥体,而在访问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去。 与事件对象类似,互斥体容易创建、打开、使用并清除。利用CreateMutex() API 可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。

为了获得互斥体,首先,想要访问调用的线程可使用OpenMutex() API来获得指向对象的句柄;然后,线程将这个句柄提供给一个等待函数。当内核将互斥体对象发送给等待线程时,就表明该线程获得了互斥体的拥有权。当线程获得拥有权时,线程控制了对共享资源的访问——必须设法尽快地放弃互斥体。放弃共享资源时需要在该对象上调用ReleaseMute() API。然后系统负责将互斥体拥有权传递给下一个等待着的线程(由到达时间决定顺序) 。 实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000 Professional操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版。 实验内容与步骤 1. 事件对象 2. 互斥体对象 1. 事件对象 清单2-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000 Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。

windows 2003 通过故障恢复控制台修复系统

windows 2003 通过故障恢复控制台修复系统 1在光驱里面放置,安装系统时所使用的光盘我应windows server 2003 enterprise edition 2 在boot里面设置启动程序为光盘启动为默认启动模式 3 光盘启动后选择从故障恢复控制台修复 进入后选择我的电脑显示1:c:\windows 要登录到那个windows 安装?输入 1 然后回车(因为只安装了一个操作系统) 这时出现 请键入管理员密码:(如输入你原来系统中管理员密码) 显示c:\windows 自此按照以下步骤输入 情况1 如果出现 NTLDR is missing 或者NTDETECT failed 如下执行1:首先确保服务器的所有USB或者外接设备的接头没有接入电脑 2:拷贝文件之前,我们先要用attrib –r命令去掉ntldr和https://www.360docs.net/doc/0812072608.html,文件的只读属性,不然一会修复的时候可能就会遇到问题。 atrrib -r c:\ntldr 或者atrrib -r c:\https://www.360docs.net/doc/0812072608.html, 3:将光盘中这两个文件拷贝到当前系统文件夹下 copy G:\i386\ntldr c:\ (假设默认的光盘是G盘) 出现要改写ntldr吗?(是/否/全是)输入y 然后回车 copy G:\i386\\https://www.360docs.net/doc/0812072608.html, c:\ 出现要改写https://www.360docs.net/doc/0812072608.html,吗?(是/否/全是)输入y 然后回车

4:用fixmbr命令修复硬盘的主引导记录 输入fixmbr 出现确实要写入一个新的主启动纪录吗?输入y 然后回车 5:用fixboot命令修复硬盘引导扇区。 输入fixboot 出现确实要写入一个新的启动扇区到主引导扇区吗?输入y 然后回车 6:输入exit 回车然后重新进入系统(将解决以上问题) 情况2 出现错误代码为0xC000218,0x00000051的蓝屏错误,或是提示System32/config missing 之类的注册表错误。 因为2000/XP/2003操作系统每隔一段时间就会自动备份一次注册表文件,所以我们可以尝试通过把\windows\repair\目录下自动备份的文件拷贝回去来实现修复。 具体的方法可以参考微软公司官方的一篇文档,链接如下: https://www.360docs.net/doc/0812072608.html,/kb/307545/zh-cn。 这里举恢复c:\windows\repair\system.bak文件为c:\windows\system32\config\system文件为例 按照情况1的1、2步骤进入恢复控制台 3: 然后执行copy c:\windows\repair\system.bak c:\windows\system32\config\system 出现要改写system吗?输入y 然后输入回车 情况3 NTFS文件系统或是无法加载启动卷类型的错误往往都是因为磁盘出现了严重的逻辑错误引起的。对于这种情况,我们可以尝试检查并修复磁盘的逻辑错误和硬盘引导记录试试看。 同样按照情况1的1、2步骤进入恢复控制台 3:使用chkdsk /r命令来修复磁盘逻辑错误。 注意,这个命令视硬盘大小,运行时需要的时间会有所不同。一般都需要至少10分钟才能检查完毕,要耐心等待 输入chkdsk /r 然后输入回车

Windows多线程程序设计

Windows多线程程序设计- - 1、产生一个线程,只是个框架,没有具体实现。理解::CreateThread函数用法。 #include DWORD WINAPI ThreadFunc(LPVOID); int main() { HANDLE hThread; DWORD dwThreadID; hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ThreadFunc), NULL, 0, &dwThreadID); ...; return 0; } DWORD WINAPI ThreadFunc(LPVOID lParam) { ...; return 0; } 2、一个真正运转的多线程程序,当你运行它的时候,你会发现(也可能会害怕),自己试试吧。说明了多线程程序是无法预测其行为的,每次运行都会有不同的结果。 #include #include using namespace std; DWORD WINAPI ThreadFunc(LPVOID); int main() { HANDLE hThread; DWORD dwThreadID; // 产生5个线程 for(int i=0; i<5; i++)

{ hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(ThreadFunc), (LPVOID)&i, 0, &dwThreadID); if(dwThreadID) cout << "Thread launched: " << i << endl; } // 必须等待线程结束,以后我们用更好的处理方法 Sleep(5000); return 0; } DWORD WINAPI ThreadFunc(LPVOID lParam) { int n = (int)lParam; for(int i=0; i<3; i++) { cout << n <<","<< n <<","<< n << ","< } return 0; } 3、使用CloseHandle函数来结束线程,应该是“来结束核心对象的”,详细要参见windows 多线程程序设计一书。 修改上面的程序,我们只简单的修改if语句。 if(dwThreadID) { cout << "Thread launched: " << i << endl; CloseHandle(dwThreadID); } 4、GetExitCodeThread函数的用法和用途,它传回的是线程函数的返回值,所以不能用GetExitCodeThread的返回值来判断线程是否结束。 #include #include using namespace std;

故障恢复控制台是Windows 2000

故障恢复控制台是Windows 2000/XP/2003中专用于修复系统的工具,它可以启用和禁用服务、格式化驱动器、在本地驱动器上读写数据(包括被格式化为NTFS 文件系统的驱动器),并执行许多其他管理任务,是我们连Windows 2000/XP/2003安全模式都无法进入时修复系统的“法宝”。 1.使用故障恢复控制台计算机启动时选择“Microsoft Windows Recovery Console”(即故障恢复控制台)后,当系统给出提示时,输入管理员(Administrator)密码。然后在系统提示符下,键入“Recovery Console”命令。输入“help”可得到一列命令名称,输入“help 命令名称”可得到指定命令的帮助。 在故障控制台中,我们可以使用Attrib、Batch、Bootcfg、ChDir (CD)、Chkdsk、Cls、Copy、Delete (Del)、Dir、Disable、format、Diskpart、Enable、Expand 、Fixmbr、Fixboot 等命令,对计算机出现的各种问题进行修复。 2.实用命令介绍 显然,故障恢复控制台中的很多命令是我们已经很熟悉的,在此不再赘述。下面为大家介绍一般用户平时不常使用的命令,利用它们,我们可以轻松地完成许多系统维护工作。本期的“老树新花说DOS③”,介绍了可以在故障恢复控制台中使用的Expand、Rmdir命令。 ①Diskpart 作用:创建和删除硬盘驱动器上的分区。 语法:Diskpart [/add/delete] [device_namedrive_namepartition_name] [size] 参数:如果不带任何参数,将启动Diskpart 的Windows 字符模式版本。 /add——创建新的分区; /delete——删除现有分区; drive_name——以驱动器号表示的待删除分区,仅与“/delete”同时使用,如“E:”; partition_name——以分区名称表示的待删除分区,可代替“drive_name”,使用(仅与“/delete”同时使用); size——要创建的分区大小,以兆字节(MB)表示,仅与“/add ”同时使用。 实例: 删除F分区——diskpart /delete F: 创建一个200MB 的分区——diskpart /add DeviceHardDisk0 200

一个多线程的windows控制台应用程序

一个多线程的windows控制台应用程序 一、要求: 编写一个单进程、多线程的windows控制台应用程序。 二、平台: Window XP C# 三、内容: 每个进程都有分配给它的一个或多个线程。线程是一个程序的执行部分。 操作系统把极短的一段时间轮流分配给多个线程。时间段的长度依赖于操作系统和处理器。 每个进程都开始一个默认的线程,但是能从它的线程池中创建一个新的线程。 线程是允许进行并行计算的一个抽象概念:在一个线程完成计算任务的同时,另一个线程可以对图像进行更新,两个线程可同时处理同一个进程发出的两个网络请求。 如图所示,选择操作: 1、创建和启动一个线程。在一个进程中同时教和运行两个线程,并且可以不需要停止或者释放一个线程。 相关代码及其解释: public class Threading1:Object { public static void startup() { //创建一个线程数组 Thread[] threads=new Thread[2]; for(int count=0;count

public static void Count() { for(int count=1;count<=9;count++) Console.Write(count+" "); } } 输出结果: 这里通过new方法创建了两个线程,然后使用start()方法来启动线程,两个线程的作用是:两个线程同时从1数到9,并将结果打印出来。 运行上面的程序代码时,可能会在控制台上输出多种不同的结果。从123456789123456789到112233445566778899或121233445566778989在内的各种情况都是可能出现的,输出结果可能与操作系统的调度方式有关。 2、停止线程。当创建一个线程后,可以通过多种属性方法判断该线程是否处于活动状态,启动和停止一个线程等。相关代码及其解释: public class MyAlpha { //下面创建的方法是在线程启动的时候的时候调用 public void Beta() { while(true) { Console.WriteLine("MyAlpha.Beta is running in its own thread."); } } } public class Simple { public static int Stop() { Console.WriteLine("Thread Start/Stop/Join"); MyAlpha TestAlpha=new MyAlpha(); //创建一个线程对象 Thread MyThread=new Thread(new ThreadStart(TestAlpha.Beta)); //开起一个线程 MyThread.Start(); while(!MyThread.IsAlive);

因windows、system32、config、system 的损坏或丢失解决方法

因windows/system32/config/system的损坏或丢失解决方法 这是因为你电脑的初始化文件遭破坏所致。导致破坏的原因也可能是病毒或其他原因。 由于Windows启动需要读取Syatem.ini,Win.ini和注册表文件,如果C盘根目录下有config.sys,Autoexec.bat 文件,这两个文件也会被读取。只要这些文件存在错误信息就可能出现死机。 1,这个问题多半是由于内存条质量原因引起,请先检查与更换内存测试 2,硬盘坏道,请修复。 3,以上都不是的话,请用以下方法 当XP启动不起来并提示以下文件损坏或丢失windows无法启动 WINDOWS/system32/config/system 需要光盘启动按"r"修复时,采用这种办法前提是你必须能重启到DOS下,如果你的系统是NTFS的话,那还要DOS支持才行;请用相关启动光盘或MaxDOS启动到DOS下 先到windows/repair目录里 然后copy system c:/windows/system32/config/system 这样就可以重启到桌面了 但这样你以前的设置就全没了,这是恢复到你第一次启动到桌面时的配置,你还要重新安装你的驱动和设置 如何是用windows 2000系统也出现这个提示:C:/winnt/system32/config/system 或者c:/winnt/system32/drivers/ntfs.sys文件丢失,方法也是可以用2000的系统安装光盘进入安装界面按R键进行修复. 如何不用是用2000还是用XP同样出现这两种问题的话,我想一定是硬件有问题,第一可能内存有质量问题(特别是旧内存),第二有可能是硬盘的问题,旧硬盘出现比较多一些. 电脑显示system文件丢失。重装后第二天还是同样问题 是你的硬盘坏道下面是检测隔离硬盘坏道的工具,你下载了扫描一下就知道了在天极网Ftp://https://www.360docs.net/doc/0812072608.html,/home1/soft34/fbdisk10.zip下载一个大小仅19.8KB的小软件FBDISK(坏盘分区器)。它可将有坏磁道的硬盘自动重新分区,将坏磁道设为隐藏分区。在DOS下运行FBDISK,屏幕提示Start scan hard disk?(Y/N),输入Y,开始扫描硬盘,并将坏道标出来,接着提示Write to disk?(Y/N),选Y。坏道就会被隔离

使用故障恢复控制台修复不能启动的Windows系统

我们这里介绍的方法在原理上来说十分简单,即首先将文件删除,然后通过“BootCfg /Rebuild”命令将其重建,在重建的过程中,BootCfg同时也会修复在本文开篇所列出的多种可能损坏的系统文件,最后使用FixBoot写入新的启动扇区。通过这样的方法,只需简单的8条命令,即可修复绝大多数Windows系统不能正常启动的故障。 下面我们分步骤详细解释。 删除文件 首先,上面我们说过,进入系统控制台后,默认工作目录为系统目录,如果Windows 安装在C:盘时,即“c:windows”,而文件在根目录上,此时我们需要进入上一级目录: 命令1 : cd.. 是一个相当重要的系统文件,因此,在未解除系统对其的保护状态前,我们是不能对其进行删除操作的。要做到这一点,需要运行三条命令,依次解除其隐含、只读和隐含属性,这样才能最终将其删除。 命令2 : ATTRIB –H C: 命令3 : ATTRIB –R C: 命令4 : ATTRIB –S C: 命令5 : DEL 删除的步骤 使用BootCfg修复启动故障 现在到了最重要的步骤,运行: 命令5 : BOOTCFG /REBUILD 该命令将遍历系统的安装设置,修复其中的故障部分,纠正导致Windows不能正常启动的一系列错误,并重建文件。

在重建结束后,将出现“Enter OS Load Options:”输入栏,这时,为保证系统的正常启动,需要注意的是: 1、对 Windows XP 用户而言,必须添加 /FASTDETECT 选项。 2、如果系统的CPU支持Intel的 XD 或 AMD的 NX功能,必须添加 /NOEXECUTE=OPTIN 选项。 在下面图示的例子中,为说明方便,同时添加了上面两个开关选项,不过,切记,如果您的CPU不支持相应的功能,千万不要添加 NOEXECUTE 选项,不然,会造成系统启动的故障。 而“Enter Load Identifier” 部分,则相对关系不大,输错也没有太大的影响。当然,如果您是一个完善主义者,则可如图例中输入完整的如“Microsoft Windows XP Home Edition”之类,显得比较规范。 使用BootCfg /Rebuild重建 进行磁盘检查 这一步骤将检查系统分区的完整性,虽然从某种意义上说,这一步骤并不是必需的,不过,确保系统硬盘能够运转正常,没有坏扇区,也是保证Windows系统长期安全的必要手段。命令很简单: 命令7 : CHKDSK /R /F 该命令的运行时间根据机器配置的不同而变化,在某些较为古老的PC的甚至可能会超过半个小时。 写入新的引导扇区 命令8 : FIXBOOT

windows 并发的多线程的应用

(1)苹果香蕉问题 #include using namespace std; #include #include int k; HANDLE Apple_;HANDLE Banana_; CRITICAL_SECTION mmutex; DWORD WINAPI Son(LPVOID n) {//HANDLE Apple_; CRITICAL_SECTION mmutex; int i=1; OpenSemaphore(MUTEX_ALL_ACCESS,false,"Apple_"); while(1) { ::WaitForSingleObject(Apple_,INFINITE);//等苹果 cout<<"Son eats"<

Windows下多线程同步机制

多线程同步机制 Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是: ·一个局部性对象,不是一个核心对象。 ·快速而有效率。 ·不能够同时有一个以上的critical section被等待。 ·无法侦测是否已被某个线程放弃。 Mutex Mutex是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至几十那些现成分属不同进程。它是: ·一个核心对象。 ·如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。 ·可以使用Wait…()等待一个mutex。 ·可以具名,因此可以被其他进程开启。 ·只能被拥有它的那个线程释放(released)。 Semaphore Semaphore被用来追踪有限的资源。它是: ·一个核心对象。 ·没有拥有者。 ·可以具名,因此可以被其他进程开启。 ·可以被任何一个线程释放(released)。 Ev ent Object Ev ent object通常使用于overlapped I/O,或用来设计某些自定义的同步对象。它是: ·一个核心对象。 ·完全在程序掌控之下。 ·适用于设计新的同步对象。 · “要求苏醒”的请求并不会被储存起来,可能会遗失掉。 ·可以具名,因此可以被其他进程开启。 Interlocked Variable 如果Interlocked…()函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此之外,interlocked variables主要用于引用技术。他们:·允许对4字节的数值有些基本的同步操作,不需动用到critical section或mutex之类。 ·在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

WindowsSystem32ConfigSystem文件丢失的修复方法

Windows\System32\Config\System文件丢失的修复方法 启动故障恢复控制台、创建临时文件夹、将现有注册表文件备份到新位置、删除现有位置的注册表文件,然后将注册表文件从修复文件夹复制到System32\Config 文件夹中。完成此过程之后将创建一个注册表,您可以使用此注册表启动Windows XP 具体步骤 将Windows XP 启动盘插入软盘驱动器,或将Windows XP 安装光盘插入CD-ROM 驱动器,然后重新启动计算机。 按照提示,单击以选中从CD-ROM 驱动器启动计算机所需的所有选项。 出现“欢迎使用安装程序”屏幕时,按R 键启动故障恢复控制台。 如果您使用的是双启动或多启动计算机,请从故障恢复控制台中选择要访问的安装。 按照提示,键入管理员密码。如果管理员密码为空,则只需按Enter 键。 在故障恢复控制台命令提示符处,键入下列几行命令,并在每行之后按Enter 键: md tmp copy c:\windows\system32\config\system c:\windows\tmp\system.bak copy c:\windows\system32\config\software c:\windows\tmp\software.bak copy c:\windows\system32\config\sam c:\windows\tmp\sam.bak copy c:\windows\system32\config\security c:\windows\tmp\security.bak copy c:\windows\system32\config\default c:\windows\tmp\default.bak delete c:\windows\system32\config\system delete c:\windows\system32\config\software delete c:\windows\system32\config\sam delete c:\windows\system32\config\security delete c:\windows\system32\config\default copy c:\windows\repair\system c:\windows\system32\config\system copy c:\windows\repair\software c:\windows\system32\config\software copy c:\windows\repair\sam c:\windows\system32\config\sam copy c:\windows\repair\security c:\windows\system32\config\security copy c:\windows\repair\default c:\windows\system32\config\default 键入exit 退出故障恢复控制台。计算机将重新启动。 -------------------------------- 二 ----------------------------------- 如何进入控制台:放入安装光盘,设从光驱启动,经过一段时间的初始化,出现提示操 作界面,按R进入控制台。输入操作系统的编号即可进入相应的控制台。这时系统会提示 输入密码即Administrator帐户密码。 windows/system32/config/system,这个是系统的注册表配置文件,如果损坏是无法进入系统的,解决方法是用DOS启动盘或进系统恢复控制台下,输入如下命令:copy c:\windows\repair\system c:\windows\system32\config\system

在Windows下创建进程和线程的API

利用API在Windows下创建进程和线程 前言: 谈到在Windows创建线程的例子,在网上的很多的参考都是基于MFC的。其实,就操作系统实验这个前提而言,大可不必去碰那个大型的MFC的框架。在Windows命令控制台下可创建进程及线程,做些简单的进程及线程的测试程序。 1、实验准备: 要实验的Windows下的多线程实验,应做如下准备: a) 在新建中选”Win32 Console Application”的An empty project b) 选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”Project Option”中,将”MLd”参数改成“MTd”(如图1)。 图1 选项 以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。 2、Windows下进程的创建: Windows的进程和线程模型被描述成”多进程,基于单进程的多线程”。 在创建一个线程时,Windows会做大量的工作---创建一个新的地址空间,为进程分配资源以及创建一个基线程。

CreateProcess函数的原型如下: 虽然有很多参数,不过在现阶段的实验级别,大多数参数只要用默认值即可。 下面要做的关于Windows使用进程的实验,在Linux系统下,可以使用类似: execve(char* cmdName ,char* cmdArgu)的语句从一个程序中去执行其它的程序。 而如果在Windows下,当使用CreateProcess去执行相应的功能时,只要去改变cmdLine中的容即可,其它的参数使用默认值,具体见代码1: 代码1执行的功能是从命令行中启动这个名叫的launch的测试程序,在launch后面应加上保存有需要打开程序路径的文件名: 如在命令行中键入: >launch set.txt 而set.txt中的容为: C:\\WINDOWS\\SYSTEM32\\CALC.EXE C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE NEW.TXT C:\\WINDOWS\\SYSTEM32\\CHARMAP.EXE 路径的前半部分为”C:\\WINDOWS\\”,这当然要视你的Windows系统的类型以及系统盘的存放位置而定。如果是NT或2000的机器,则应使用WINNT. /*测试程序1: 示例如使用进程的launch程序(启动程序),通过在命令行中加载相应的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行*/

如何进入系统故障恢复控制台

一.简介 Windows 2000 或 XP 系统出现故障的时候,通常我们可以通过"最后一次正确配置"、"安全模式"、"系统还原"(只用于XP)来修复。但是有一些情况是不能通过这些办法来修复的,例如:系统引导文件丢失、BOOT.INI 文件丢失或配置错误、系统DLL丢失等等。这个时候,重新安装操作系统虽然是个有效的方法,但是要花费很长的时间。其实我们还可以通过恢复控制台来做最后的尝试。使用恢复控制台,我们不但可以进行包括启用和禁用系统服务、分区和格式化磁盘、修复引导记录等操作,还可以通过复制源光盘的文件来修复丢失系统文件的错误等等。 恢复控制台虽然很实用,但是也是有一些限制: 要使用恢复控制台,必须知道系统管理员的账号和密码; 系统控制台里面只能访问以下的文件夹:引导文件夹、系统目录、可移动存储设备。如果访问其它文件夹,系统会提示"Access Denied"(拒绝访问); 在恢复控制台,可以把文件从光、软盘复制到硬盘,或者是硬盘复制到硬盘。但是不能从硬盘复制到软盘。 - 返回 - 二.启动恢复控制台 要进入恢复控制台,首先要用OS光盘启动,在出现"欢迎使用安装程序"的界面,我们可以看到第二项提示是"要使用\'恢复控制台\'修复 Windows XP安装,请按 R"。 在按了R键之后,安装程序会对磁盘进行检查。稍等片刻后,屏幕上会列出已经找到的操作系统及其安装目录,并且会自动编号。系统会询问你要登录到哪一个Windows系统,我们只要输入系统前面的序号,然后回车(千万不要直接按回车!系统会重新启动的!),然后会询问管理员的密码,输入之后按回车,这样我们就进入了修复控制台(。

Windows多线程及消息队列

1.所谓的worker线程,是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程。 2.微软的多线程模型: Win32说明文件一再强调线程分为GUI线程和worker线程两种。GUI线程负责建造窗口以及处理主消息循环。Worker负责执行纯粹的运算工作,如重新计算或重新编页等,这些运算工作会导致主线程的消息队列失去反应。一般而言,GUI线程绝不会去做那些不能够马上完成的工作。 GUI线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。所有对此窗口的改变也都应该由该线程完成。 如果worker线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker线程摇身一变成了GUI线程。这里的意思是:worker线程不能够产生窗口、对话框、消息框,或任何其他与UI有关的东西。 如果一个worker线程需要输入或输出错误信息,它应该授权给UI线程来做,并且将结果通知给worker线程。 消息队列是一个链表,只有在必要的时候,才有元素产生出来。具体的关于消息队列的数据结构,可以参考相关的windows文档。 3.在Win32中,每一个线程有它自己专属的消息队列。这并不意味着每一个窗口有它自己的消息队列,因为一个线程可以产生许多窗口。如果一个线程停止回应,或是它忙于一段耗时的计算工作,那么由它产生的窗口统统都会停止回应,但系统中的其他窗口还会继续正常工作。 以下是一个非常基本的规则,用来管理Win32中的线程、消息、窗口的互动: 所有传送给某一窗口之消息,将由产生该窗口之线程负责处理。 比方说,使用SetWindowText来更新一个Edit框的内容,其实就是发出了一个WM_SETTEXT 消息给edit窗口函数。推而广之,每一个控件都是一个窗口,都拥有自己的窗口函数。 对窗口所作的一切事情基本上都会被该窗口的窗口函数处理,并因此被产生该窗口的线程处理。当需要发送一个消息时,Windows会自动计算出哪一个线程应该接收到消息(以便确定该消息实体应该挂在在哪一个线程的消息队列中)。同时,windows还会确定线程应该如何被告知有这么一个消息进来。一共有四种可能: (1)如果属于同一线程,使用SendMessage传递消息,则直接调用窗口函数。 (2)如果属于同一线程,使用PostMessage传递消息,则把消息放在消息队列中然后立即返回。(3)如果不属于同一线程,使用SendMessage传递消息,则切换到新线程中并调用窗口函数。在该窗口函数结束之前,SendMessage不会返回。 (4)PostMessage立刻返回,消息则被放到另一线程的消息队列中。 当我send一个消息给另一线程掌握的窗口时,系统必须做一次context switch,切换到另一线程去,调用该窗口函数,然后再做一次contex t switch切换回来,相对一般的函数调用而言,期间的额外负担较大。如果在MDI中,为每个子窗口分配一个线程,那么该子窗口的所有资源——包括画刷,DC,调色板等等都属于线程的资源。此时为线程做context switch时会代价很大。

Windows故障恢复控制台

Windows故障恢复控制台- - 1. 故障恢复控制台最简单的用法,就是使用Windows安装光盘(Windows2000/XP/2003)引导系统。 使用步骤如下: 1. 将 Windows 2000 启动盘插入软盘驱动器中,或者将 Windows 2000 CD-ROM 插入 CD-ROM 驱动器中,然后重新启动计算机; 2. 按照提示,单击选中从 CD-ROM 驱动器启动计算机所需的任何选项; 3. 出现“欢迎使用安装程序”屏幕时,按 "R" 键启动故障恢复控制台; 4. 如果使用的是双启动或多启动计算机,请选择需要从故障恢复控制台访问的系统路径; 5. 键入管理员密码;如果管理员密码为空,则按 ENTER 键。 6. 进入故障恢复控制台命令行界面。 之后就会进入一个受限的命令行界面,在这个命令行界面下,可以使用故障恢复控制台启用和禁用服务、格式化驱动器、读写本地驱动器上的数据,还可以执行许多其他管理任务。可以使用故障恢复控制台将磁盘或 CD-ROM 中的文件复制到硬盘上以修复计算机,或者重新配置使计算机无法正常启动的服务。之所以说它是受限的,因为它并不能提供完整的cmd.exe 以及附加命令行程序的功能,而仅仅能够提供有限的对系统核心服务操作的功能。尤其是出于安全考虑,默认情况下是不允许修改,替换,覆盖和引用文件的。就是这个原因也让很多人对这个看似无用的控制台极为反感和头大。至于如何打开这些限制,在后面讲解。 进入故障恢复控制台后,可以输入 recovery console commands 或 help 察看所有的命令和帮助;有关特定命令的信息,可以使用help commandname察看详细信息和命令参数。 要退出故障恢复控制台并重新启动计算机,请在命令提示处键入 exit,然后按 ENTER 键。 在故障恢复控制台中支持的所有命令: attrib delete fixboot md type cd dir fixmbr mkdir systemroot chdir disable format more chkdsk diskpart help rd cls enable listsvc ren copy exit logon rename del expand map rmdir >>2. << 详细的命令功能和参数如下: * ATTRIB 可以使用attrib 命令和下面任何参数更改文件或文件夹的属性:

当前流行的Windows操作系统能同时运行几个程序独立运行

当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,分别进行探讨,并利用多线程技术进行线程之间的通信,实现了数字的简单排序。 一、实现方法 1、理解线程 要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应于Visual C++中的CwinThread类对象。单独一个执行程序运行时,缺省地包含的一个主线程,主线程以函数地址的形式出现,提供程序的启动点,如main ()或WinMain()函数等。当主线程终止时,进程也随之终止。根据实际需要,应用程序可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。 一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU 的时间,优先级高的线程优先运行,优先级低的线程则继续等待。 线程被分为两种:用户界面线程和工作线程(又称为后台线程)。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进程终止。工作线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从CWinThread类派生来创建,对它来说最重要的是如何实现工作线程任务的运行控制函数。工作线程和用户界面线程启动时要调用同一个函数的不同版本;最后需要读者明白的是,一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量。

Windows的故障恢复控制台应用实例详解

Windows的故障恢复控制台应用实例详解 当Windows 2000/XP/2003出现了启动故障,而且在安全模式或其他模式下都启动无效时,很多朋友首先想到的就是重装系统。其实不必。这时我们首先应该考虑使用Windows的“故障恢复控制台”来挽救系统,它主要可用来修复系统、禁用或启用服务、格式化磁盘、执行一些管理任务。本期将重点介绍一下利用故障恢复控制台解决一些问题的实例。 系统文件Ntfs.sys丢失 问:在将分区从FAT32文件系统转换到NTFS文件系统之后重新启动Windows XP 时出现“M issing or Corrupt Ntfs.sys”(Ntfs.sys 丢失或损坏)错误信息,导致系统无法正常启动。该如何是好? 答:在故障恢复控制台下先输入cd \windows\system32\drivers,然后按ENTER键。接着输入ren ntfs.sys ntfs.old,将损坏的Ntfs.sys文件重命名为 Ntfs.old。如果提示没有找到 Ntfs.sys 文件,则该文件丢失了。把Windows XP的安装光盘放进光驱,假设Windows XP安装在C盘、光驱的盘符为H,键入copy h:\i386\ntfs.sys c:\windows\system32\drivers,然后退出故障恢复控制台,重新启动 Windows XP即可。 系统文件NTLDR丢失 问:系统启动不了,提示一些文件丢失了。比如Windows 2000启动不了,出现以下错误信息:NTLDR is missing Press any key to restart,提示NTLDR文件丢失。我该怎么办? 答:对此类系统文件的丢失问题,我们可以使用故障恢复控制台从系统安装光盘上COPY丢失的文件。进入故障恢复控制台,把Windows 2000的安装光盘放进光驱(光驱盘符为H:),输入copy h:\i386\ntldr c:\并回车(从光驱复制ntldr文件至C盘根目录下),接着输入copy h: \i386\https://www.360docs.net/doc/0812072608.html, c:\并回车(从光盘复制https://www.360docs.net/doc/0812072608.html,文件到C盘根目录下)。如果系统提示是否覆盖文件,键入y,然后按回车键。最后键入c:\Boot.ini,如果正常显示Boot.ini中的内容则可重启,问题应该可以解决。如果显示为“系统找不到指定的文件或目录。”,那么意味着Boot.ini文件损坏或丢失,可到其他安装Windows 2000的电脑中复制该文件,将它拷贝到C 盘下,然后重启即可。利用此法可以解决大部分系统文件丢失的问题。 误删除SAM文件后 问:在Windows XP中不小心把Windows/system32/config/下的sam文件删除了,结果Win dows XP账号丢失,现在不能进入Windows XP的登录界面。由于安装有很多软件,现在想不重新安装系统就恢复Windows XP行吗? 答:进入故障恢复控制台,把Windows XP的安装光盘放进光驱(光驱盘符为H:),输入co py h:\windows\repair\sam c:\windows\system32\config\sam并回车,将H:\windows\repair \sam文件复制到c:\Windows\system32\config文件夹即可。 注意:Repair下的Sam文件是当初安装Windows XP时产生的,这样操作会丢失安装系统以及你自己在系统中创建的用户和用户组(用户信息回到全新安装时状态)。如果你开了系统还原,可以先成功地登录Windows XP,再还原到最新的还原点恢复你的全部用户设置。

相关文档
最新文档