2022-11-06 11:23来源:m.sf1369.com作者:宇宇
从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。
理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。
因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。
Win32是指你现在所使用的操作系统是32位的windows环境.Win32进程间通信的方式主要有:
(1)剪贴板(ClipBoard);
(2)动态数据交换(DynamicDataExchange);
(3)部件对象模型(ComponentObjectModel);
(4)文件映射(FileMapping);
(5)邮件槽(MailSlots);
(6)管道(Pipes);
(7)Win32套接字(Socket);
(8)远程过程调用(RemoteProcedureCall);
(9)WM_COPYDATA消息(WM_COPYDATAMessage)。在WIN32中,可使用在PSAPI.DLL中提供的ProcessstatusHelper函数帮助我们获取进程信息。(1)EnumProcesses(2)GetModuleFileNameExA
方法/步骤分步阅读
1
/6
在开始菜单中点击 运行 选项,或者是直接按下键盘的 win+R 组合快捷键。
2
/6
然后在打开的运行窗口中输入 msconfig 回车。
3
/6
然后会打开一个 系统配置 的窗口,点击上面的 引导 选项卡。
4
/6
然后可以在设备管理器或者是任务管理器中查看一下当前电脑的性能;可以看到是双核模拟四核心也就是四线程的。
5
/6
选中需要的系统,当然若是单系统的,则不用选了,然后点击 高级选项 按钮。
6
/6
然后在弹出的页面中勾选处理器以及最大内存选项,然后根据需要设置处理器的个数以及最大的内存数,设置好之后,点击 确定,确定,然后重启计算机,再次打开任务管理器,就可以看到CPU的线程数以及内存都变为设置的那样了
32的系统对多线程支持没有64位的好,程充能运行但效率会比64位的低
启动 Visual Studio .NET、Visual Studio 或 Visual c # 速成版。
创建一个新的名为ThreadWinApp的 Visual c # Windows 应用程序项目。
向该表单添加“按钮”控件。 默认情况下,该按钮名为Button1。
将 ProgressBar 组件添加到窗体中。 默认情况下,进度栏名为 " ProgressBar1"。
右键单击该表单,然后单击 "查看代码"。
将以下语句添加到文件的开头:
using System.Threading;
button1_Click为 Button1 添加以下事件处理程序:
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("This is the main thread");
}
将以下变量添加到 Form1 类:
private Thread trd;
将以下方法添加到 Form1 类中:
private void ThreadTask ()
{
int stp;
int newval;
Random rnd = new Random ();
while (true)
{
stp = this.progressBar1.Step * rnd.Next (-1, 2);
newval = this.progressBar1.Value + stp;
if (newval > this.progressBar1.Maximum)
newval = this.progressBar1.Maximum;
else if (newval < this.progressBar1.Minimum)
newval = this.progressBar1.Minimum;
this.progressBar1.Value = newval;
Thread.Sleep (100);
}
}
这是用于为线程编写基础的代码。 此代码是无限循环,它在 ProgressBar1 中随机递增或递减值,然后等待100毫秒后再继续。
Form1_Load为 Form1 添加以下事件处理程序。 此代码将创建一个新线程,使该线程成为后台线程,然后启动该线程。
private void Form1_Load(object sender, System.EventArgs e)
{
Thread trd = new Thread(new ThreadStart(this.ThreadTask));
trd.IsBackground = true;
trd.Start();
}
你这个问题描述的不太清楚。是32G内存呢?还是2G内存呢?还是322g内存?就分别回答吧。
根据微软的官方消息,即将推出的win11的最低配置要求是:1 GHz 或更快的支持 64 位的处理器(双核或多核)或系统单芯片 (SoC)、4GB的RAM、支持支持 DirectX 12 或更高版本,支持 WDDM 2.0 驱动程序的显卡、 9 英寸的高清 (720p) 显示屏,每个颜色通道为 8 位。
所以如果你说的是32GB的内存,那肯定应该够了,而且已经是很豪华的配置了。一般来讲比最低配置高出一倍也就是8GB,就能够比较流畅的运行,再高出一倍也就是16 GB,就两个比较流畅的玩游戏了。如果是32GB,那从内存方面基本上就是通吃了。如果你说的是2GB,那就肯定不够了。
private void ThreadFun()
{
//线程操作
}
//需要启动线程的方法
private void Fun1()
{
Thread m_thread=new Thread(ThreadFun);
m_thread.Start();
}
还需要加一个using System.Threading;
多线程其实非常简单,DELPHI有多线程的类,你添加即可使用,但是我喜欢自己调用API,方法如下:
定义一个函数或者过程,这个函数就是线程要执行的内容,然后调用API就可以不断创建线程,每个线程都单独的执行那个函数,执行完毕线程就自动关闭,下面是我程序里面的部分代码:
{下面这个就是线程过程,我的线程传递一个参数,建立的SOCKET}procedureClientThread(varsock:TSOCKET)
;stdcall;var……;begin……end;{下面是主程序建立服务,等待连接,连接后调用线程进行处理的代码}repeatiAddrSize:=sizeof(client)
;sClient:=accept(sListen,@client,@iAddrSize)
;ifsClient=INVALID_SOCKETthenbeginSocketErrorMsg(sClient,'accept()fail')
;break;end;writeln('Acceptedclient:',inet_ntoa(client.sin_addr),':',ntohs(client.sin_port),'sock=',sClient)
;hThread:=CreateThread(nil,$1000,@ClientThread,@sClient,0,dwThreadId)
;ifhThread=0thenbeginwriteln('CreateThread()fail:',GetLastError)
;break;end;CloseHandle(hThread);untilfalse;
一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。
一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。
1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。
2】创建Thread子类的实例,也就是创建了线程对象
3】启动线程,即调用线程的start()方法