TALK IS CHEAP, SHOW ME THE CODE.

GameShell是一款开源复古掌机,运行Arm Linux操作系统,软硬件均开源,是极客、游戏开发者以及手办爱好者(确实算手办,草)的绝佳玩物。

Godot是一款开源跨平台游戏引擎,目前发展迅速,原来仅支持GDScript,后来支持VisualScript(可视化逻辑节点编辑器),现已经支持使用GDNative来使用C++编写库,也开始慢慢支持C#(BETA测试)。

那么,Godot制作的游戏,可以导出项目,在Armv7架构的GameShell上运行吗?

答案是:Godot, YYYYYYYEEEEEEEESSSSS!

接下来我将为大家展示在GameShell上运行Godot游戏的具体过程。

Read More

简介

概述

网络程序设计思想

设计网络程序,首先要确定通信协议(protocol),要在高层决断通信由哪个程序发起以及响应在何时发生。

守护程序

一个长时间运行的程序,即守护程序(daemon)。一般而言Web服务器程序是一种守护程序。

C/S模式

大多数网络应用按照划分成客户端(client)和服务器(server)来组织的,即C/S模式。客户端和服务器间通过应用协议来通信。

Web应用的通信过程

Read More
post @ 2021-06-24

TCP/IP协议族

TCP/IP是一个实现Internet体系结构的协议族,它来源于ARPANET参考模型。

协议族

一系列协议的集合称为一个协议族。

体系结构/参考模型

指定一个协议族中各种协议之间的相互关系并划分需要完成的任务的设计,称为协议族的体系结构或参考模型。

Internet体系结构原则

Internet体系结构应将多种网络互联起来,并在互联网络上同时运行多个应用。

Internet目标列表

  • Internet 通信在网络或网关失效时必须能持续。
  • Internet 必须支持多种类型的通信服务。
  • Internet 体系结构必须兼容多种网络。
  • Internet 体系结构必须允许对其资源的分布式管理。
  • Internet 体系结构必须是经济有效的。
  • Internet 体系结构必须允许低能力主机的连接。
  • Internet 中使用的资源必须是可统计的。
Read More

Overlapped I/O 简介

Overlapped I/O 是 Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在 I/O 进行过程中仍然能够继续处理事务。它又被称为非阻塞 I/O 或异步 I/O 。

假设一个线程向设备发出一个异步 I/O 请求。这个 I/O 请求被传给设备驱动程序,后者负责完成实际的 I/O 操作。当驱动程序在等待设备响应的时候,应用程序的线程并没有因为要等待 I/O 请求完成而被挂起,线程会继续运行并执行其它有用的任务。

它包含从简单到高级的四种异步 I/O 的方式:

  • 激发的 File Handles
  • 激发的 Event Objects
  • 异步过程调用(Asynchronous Procedure Call, APC)
  • I/O Completion Port (IOCP)

使用 Overlapped I/O 的前提

为了以异步的方式访问设备,我们需要调用 Win32 的 CreateFile 函数,并指定 dwFlagsAndAttributes 参数为 FILE_FLAG_OVERLAPPED 标志来打开设备。这个标志告诉操作系统,我们想以异步的方式来访问设备。

为了将 I/O 请求加入设备驱动程序的队列中,我们必须使用 Win32 的 ReadFile 和 WriteFile 函数。

CreateFile 函数

不要被它的名称愚弄了,它不仅可以打开文件(File),还可以打开更多其它设备。

Read More

CLR线程池

每个CLR一个线程池,该线程池由CLR控制的所有AppDomain共享。如果一个进程加载了多个CLR,则每个CLR都有它自己单独的线程池。

CLR初始化时,线程池内没有线程。线程池内部维护了一个操作请求队列。应用程序执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的操作请求队列中。线程池的代码从这个队列中提取记录项,将这个记录项派发(dispatch)给一个线程池线程。如果线程池中没有线程,就创建一个新线程。当线程池线程完成任务后,不会被销毁,而是返回线程池,进入空闲状态,等待分配新任务。

线程池是启发式的,能够根据当前应用程序负载和硬件能力来自动调节工作模式。

ThreadPool类

ThreadPool类提供了QueueUserWorkItem方法来将一个异步的计算限制操作添加到线程池的队列中:

1
2
3
public static bool  QueueUserWorkItem(WaitCallback callBack);

public static bool QueueUserWorkItem(WaitCallback callBack, Object state);

WaitCallback委托:

1
delegate void WaitCallback(object state);

执行上下文与ExecutionContext类

Read More

本篇文章总结一下多线程中,Win32 API和C# API的对应关系,它们时常是类似的,但也存在一些区别。

线程

创建线程

创建线程,一般要指定线程要“做什么”,即指定一个函数指针或者委托。

Win32使用CreateThread函数来创建线程:

1
2
3
4
5
6
7
8
HANDLE CreateThread(
PSECURITY_ATTRIBUTES pThreadAttributes,
DWORD dwStackSize,
PTHREAD_START_ROUTINE pStartAddress,
PVOID pParameter,
DWORD dwCreationFlags,
PDWORD pdwThreadId
)

C#对线程进行了封装,使用以下语句创建线程:

1
2
3
Thread t = new Thread(()=>{
Console.WriteLine("Hello,Thread");
});

对于同一件事情,两者的实现会不一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);

int main()
{
HANDLE hThread;
DWORD threadId;
hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId);
return 0;
}

DWORD WINAPI ThreadFunc(LPVOID p)
{
int p0 = (int)p;
printf("Parameter:%d\n", p0);
}
Read More

FAQ整理

FAQ 01: 合作型(cooperative)多任务与抢占式(preemptive)多任务有何不同?

合作型(cooperative)多任务是指由程序员来控制程序如何分享CPU资源,多个程序之间需要适当分享CPU资源,一旦一个程序拒绝与其他程序共享资源而占用所有资源的话,其它程序则无法做任何事情。即可控权不在操作系统,而在程序。

提示

Windows 1、2、3为合作型多任务操作系统

抢占式(preemptive)多任务是指由操作系统来控制程序如何分享CPU资源,无需程序员操心CPU资源共享的问题。即可控权在操作系统而不在程序。

提示

Unix、VMS、AmigaDOS等为抢先式操作系统

FAQ 02:我可以在Win32s中使用多个线程吗?

不可以。Win32s是Win32 API在Windows 3.1中的移植,但是不幸的是许多功能没有办法移植。Win32s既不支持抢先式多任务也不支持多线程。

提示

在Windows NT及以后版本中可以使用多线程。

FAQ 03:线程和进程有什么不同?

Read More

类型对象什么时候加载到Loader堆?类型初始化器又是什么时候被调用?

Read More

AppDomain可以被手动卸载,有的时候我们可能需要程序能够监听到某个或某些AppDomain的卸载。

那么,程序如何监视AppDomain的卸载呢?

探索System.AppDomain提供的的所有事件成员

首先我想到的是查看AppDomain类是否提供了一些公开的事件成员。

为了快速找到有哪些事件成员,我通过AppDomain的静态方法CreateDomain创建一个AppDomain实例后,通过智能感知,勾选闪电图标(代表事件),来快速得到结果:

可以发现,提供了9种公开的事件成员:

  • DomainUnload : 在即将卸载AppDomain时发生
  • AssemblyLoad : 在加载程序集时发生
  • AssemblyResolve : 在对程序集的解析失败时发生
  • FirstChanceException : 当托管代码抛出异常时发生,在运行时在调用堆栈中搜索应用程序域中的异常处理程序之前
  • ProcessExit : 当默认应用程序域的父进程存在时发生
  • ReflectionOnlyAssemblyResolve : 当程序集的解析在仅限反射的上下文中失败时发生
  • ResourceResolve : 当资源解析因资源不是程序集中的有效链接资源或嵌入资源而失败时发生
  • TypeResolve : 在对类型的解析失败时发生
  • UnhandledException : 当某个异常未被捕获时出现

第一个,恰好就是我需要的事件成员:DomainUnload。

Read More
post @ 2021-01-24

在Windows中,我们如何深入理解线程这个概念?

Read More
⬆︎TOP