抱歉长度,这是必要的.
介绍
我正在使用C#4.0 for Windows Vista/7开发一个远程桌面软件(只是为了好玩).我已经遇到了基本障碍:我有一个强大的UDP消息系统,相对干净的程序设计,我有一个镜像驱动程序(来自DemoForge的免费DFMirage镜像驱动程序)启动并运行,我已经为所有人实现了NAT遍历除对称NAT之外的NAT类型(存在于公司防火墙情况下).
关于屏幕传输/共享,由于镜像驱动程序,我会自动通知已更改的屏幕区域,我可以简单地将镜像驱动程序不断变化的屏幕位图封送到我自己的位图.然后我将屏幕区域压缩为PNG并将其从服务器发送到我的客户端.事情看起来很不错,但还不够快.它和VNC一样慢(顺便说一下,我不使用VNC协议,只是一个自定义的业余协议).
从最慢的远程桌面软件到最快的,列表通常从所有类似VNC的实现开始,然后爬到Microsoft Windows远程桌面......然后...... TeamViewer.对CrossLoop,LogMeIn不太确定 - 我没有使用它们,但TeamViewer 非常快.它真的很直播.我tree
在命令提示符上运行了一个命令,它以20毫秒的延迟更新.我可以浏览网页比我的笔记本电脑慢几毫秒.在Visual Studio中垂直滚动代码的延迟时间为50毫秒.想想TeamViewer的屏幕传输解决方案必须具备多么强大的功能才能实现这一切.
VNC使用基于轮询的钩子来检测屏幕变化和暴力屏幕捕获/比较最坏的情况.在最好的情况下,他们使用像DFMirage这样的镜像驱动程序.我在这个级别.他们使用称为RFB协议的东西.
Microsoft Windows远程桌面显然比VNC高出一步.我从StackOverflow的某个地方听说,Windows远程桌面不会发送屏幕位图,而是发送实际的绘图命令.这非常棒,因为它可以发送简单的文本(在此坐标处绘制此矩形并使用此渐变对其进行着色)!远程桌面确实非常快 - 而且它是在家工作的标准方式.它使用了一种称为RDP协议的东西.
现在TeamViewer对我来说是一个完全的谜.显然,他们发布了第2版的源代码(截至2012年2月,TeamViewer版本为7).人们已经阅读过它并说版本2没用 - 它只是对VNC进行自动NAT遍历的一些改进.
但版本7 ......现在它的速度非常快.我的意思是,它实际上比Windows远程桌面更快.我用TeamViewer流式传输DirectX 3D游戏(1 fps,但Windows远程桌面甚至不允许DirectX运行).
顺便说一句,TeamViewer在没有镜像驱动程序的情况下完成所有这些操作 有一个选项可以安装一个,它会更快一点.
问题
我的问题是,TeamViewer如此快速?一定不可能.如果你在24位深度(16位深度显然很难看)的情况下获得1920 x 1080分辨率,那么原始数据仍为6,220,800字节.即使使用libjpeg-turbo(大公司使用的最快的JPG压缩库之一),将其压缩到30KB(让我们非常慷慨),也需要时间来通过TeamViewer的服务器(TeamViewer通过简单地代理流量来绕过公司的Symmetric NAT)他们的服务器).并且libjpeg-turbo压缩需要时间来压缩.对于我来说,高质量的JPG压缩需要175毫秒才能获得完整的1920 x 1080截图.如果主机的计算机运行Atom处理器,那么这个数字会上升.我根本不明白TeamViewer如何很好地优化了他们的屏幕传输.同样,小尺寸图像可能会被高度压缩,但需要至少几十毫秒来压缩.大尺寸图像不需要时间压缩,但需要很长时间才能完成.不知何故,TeamViewer完成整个过程以获得大约每秒20-25帧.我使用过网络监视器,TeamViewer在500 Kbps和1 Mbps的速度下仍然没有时滞(VNC软件在该传输速率下滞后几秒钟).在我的tree
命令提示符测试期间,TeamViewer以1 Mbps的速率接收入站数据,仍然运行5-6 fps.VNC和远程桌面不这样做.又怎样?
答案有点复杂和错综复杂,所以如果你只是说它是因为他们使用UDP而不是TCP(请你认为他们确实使用TCP就像成功一样),请不要发布0.02美元.
我希望在StackOverflow上有一个TeamViewer开发人员.
潜在的答案
一旦人们回复,将更新此内容.
performance operating-system udp network-programming remote-desktop
我希望这是一个简单的任务,但我很惊讶没有找到答案.
让我澄清一下:
我不想adb logcat -c
手动打电话.事实上,我甚至没有使用命令行来查看LogCat,所以我认为这是不可能的(编辑:实际上,它是通过在单独的命令行中运行命令...但我没有想要这样做).我正在使用Eclipse来查看LogCat.
我不想Clear Log
每次都点击按钮.这就是我现在正在做的事情.
我以编程方式或通过Eclipse的运行/调试配置来做,但是,每次我点击+ 运行我的Android项目时都想要一种自动清除LogCat 的方法.我的LogCat变得杂乱无章.+ 并不重要 - 这只是我调试的快捷方式.我想在Debug/Run上清除LogCat.CtrlF11CtrlF11
我在Windows 7上使用Eclipse并使用Nexus One(不是模拟器)进行调试.
我试过了:
修改调试/运行配置.(Project
- > Properties
- > Run/Debug Settings
- > Edit Launch Configurations
)从模拟器运行是唯一的添加方式Additional Emulator Command Line Options
.但是我从实际的Android设备运行,所以我无法访问这些选项.
建设者?我不知道如何使用它.(Project
- > Properties
- > Builders
).每次运行时如何使用它来清除LogCat?
我开始认为当活动前台进程将光标移动到按钮并单击它时,我必须编写一个宏程序来挂钩Ctrl+ .我想自动清除LogCat要求太多了.F11eclipse.exe
Clear Log
我所知道的唯一一款可以在任何浏览器中减速和加速播放YouTube视频的好软件,无需先下载(因为这很麻烦),是Enounce MySpeed.
不幸的是,这个软件不是免费的,我的试用版用完了.我正在玩它的注册表设置并注意到几个键:
ProgramsToHook: iexplore.exe;firefox.exe;plugin-container.exe;chrome.exe;safari.exe;opera.exe;maxthon.exe;feeddemon.exe;realplay.exe;flvplayer.exe;flv player.exe;flock.exe;adobe media player.exe
UseFlashAdapter: 1
LLModules: ole32.dll;nspr4.dll;chrome.exe;realplay.exe;objb3201.dll;oleaut32.dll;rpflashplayer.dll
ModulesToIntercept: flash10*;flash9*;npswf32.dll;gcswf32.dll;fldbg10*;flashplayer.3.1.1k.ocx;adobe media player.exe
Run Code Online (Sandbox Code Playgroud)
根据这些注册表项的名称和值,我猜测MySpeed软件会挂钩列出的模块中的一些函数(但模块是否与DLL相同?)并且每个进程都这样做在ProgramsToHook中列出.这是我不明白的.MySpeed软件的概念是什么?显然这是挂钩的东西,但我不太熟悉Windows钩子的错综复杂,所以我来问你专家.我想如果我能理解这个钩子进程是如何工作的,我可以使用EasyHook制作我自己的软件版本,这是一个非常棒的.NET库来执行用户模式和内核模式钩子.
我认为Windows用户模式挂钩就是这样的.您在一个DLL中选择一个函数,并在一个您想要的进程中截取该函数(也称为钩子).如果要在多个进程中挂钩DLL,则只需为每个进程重复该过程.
然后内核模式挂钩只是在一个DLL中选择一个函数并在每个调用它的进程中拦截该函数(因此是内核模式).但肯定有很多方法可以勾选; 我不太确定这两个钩子和DLL注入之间的区别.
所以重点是,我想知道MySpeed是如何工作的.他们的挂钩概念是什么?如果我能知道这一点,那么我可以用.NET制作这样的软件!
提前致谢.
StackOverflow上有很多问题,询问如何隐藏Form1并显示Form2.而且,通常会出现一些不同的答案:
1)
// Program.cs
Application.Run(new Form1());
// Form1.cs
Form2 form2 = new Form2();
form2.Show();
this.Hide();
Run Code Online (Sandbox Code Playgroud)
2)
// Program.cs
Form1 form1 = new Form1();
Form2 form2 = new Form2();
form1.Show();
form2.Show();
Application.Run();
Run Code Online (Sandbox Code Playgroud)
...etc..
我不是在寻找像#1这样简单的一次性解决方案.我正在寻找最佳的表单管理实践.一个5-8种形式的应用程序,经常打开和关闭 - 管理这些表单的最佳方法是什么?
我的想法是让每个形式成为一个(懒惰的?)Singleton并将它们埋在某种FormsManager
类中(比如解决方案#2但是++).然后个别形式可能会称之为FormsManager.GetForm<WelcomeDialog>()
.
但我想知道有更多经验的人使用过什么.同样,这些解决方案不应该是快速破解.它们应该是面向设计的,可能是架构的,也是长期的解决方案.
编辑:
对于可能遇到同样问题的人来说,这是一个非常通用的问题(因此要求非常开放).具体到我的情况,我不需要在启动时显示多个表单.另外,我没有MDI表格.我可能有一些模态形式,但它们大多是非模态的.
我正在写一个网络应用程序.
消息通过传输方式发送:
Network.SendMessage (new FirstMessage() );
Run Code Online (Sandbox Code Playgroud)
我可以注册一个事件处理程序,当这个消息类型到达时调用,如下所示:
Network.RegisterMessageHandler<FirstMessage> (OnFirstMessageReceived);
Run Code Online (Sandbox Code Playgroud)
事件被解雇了:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
}
Run Code Online (Sandbox Code Playgroud)
我正在为我的网络应用程序编写自定义身份验证过程,这需要大约五条消息才能完成.
不使用任务并行库,我将被迫编写前面的事件处理程序中的每个过程的下一步,如下所示:
public void OnFirstMessageReceived(EventArgs<FirstMessageEventArgs> e)
{
Network.SendMessage( new SecondMessage() );
}
public void OnSecondMessageReceived(EventArgs<SecondMessageEventArgs> e)
{
Network.SendMessage( new ThirdMessage() );
}
public void OnThirdMessageReceived(EventArgs<ThirdMessageEventArgs> e)
{
Network.SendMessage( new FourthMessage() );
}
public void OnFourthMessageReceived(EventArgs<FourthMessageEventArgs> e)
{
// Authentication is complete
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢跳过源代码来编写部分内容和部分内容的想法.这很难理解和编辑.
我听说任务并行库大大简化了这个解决方案.
但是,我使用任务并行库读取的许多示例都与启动一系列活动任务有关.我所说的' 主动 '是指每个任务都可以在明确调用时启动,如下所示:
public void Drink() {}
public void Eat() {}
public void Sleep() {}
Task.Factory.StartNew( () => …
Run Code Online (Sandbox Code Playgroud) c# asynchronous event-based-programming task-parallel-library
环境是Visual Studio 2012,ServiceStack,ASP.NET Web应用程序项目(关注https://github.com/ServiceStack/ServiceStack/wiki/Create-your-first-webservice)
通过查看ServiceStack.Examples中的一些类,我注意到大多数服务只包含一个方法.有些覆盖Execute()
或者,如果是REST服务,有些覆盖OnPost/Get/Put/Delete()
.
我应该如何看待做一个完整的API集,如果我有几我需要实现的功能RegisterUser()
,RemoveUser()
,AddFriend()
,RemoveFriend()
...每个方法的一个服务?
public RegisterUserService : IService<User> { public object Execute(User> dto) { ... } }
public RemoveUserService : IService<User> { public object Execute(User> dto) { ... } }
public AddFriendService : IService<Friend> { public object Execute(Friend dto) { ... } }
public RemoveFriendService: IService<RequestDTO4> { public object Execute(Friend dto) { ... } }
Run Code Online (Sandbox Code Playgroud)
我很失落如何开始实现完整的API集.我已经阅读了"创建您的第一个Web服务" 的第一个和第二个 Wiki页面,我已经复制了该服务方法.但现在我想制作10或40种服务方法,我不知道该怎么做.
我注意到,实现from IRestService<T>
允许你最多4个方法而不是一个 …
可能重复:
C# - 永久删除文件
你好,
我正在使用C#.NET Framework 2.0.我有一个与文件粉碎有关的问题.
我的目标操作系统是Windows 7,Windows Vista和Windows XP.可能是Windows Server 2003或2008,但我猜它们应该与前三个相同.
我的目标是安全地删除文件.
我不相信使用File.Delete是安全的.我在某处读到,当您删除文件时,操作系统只是标记要删除的原始硬盘数据 - 数据根本不会被删除.这就是为什么存在这么多工作方法来恢复所谓的"已删除"文件的原因.我也读过,这就是覆盖文件更有用的原因,因为那时磁盘上的数据实际上必须要改变.这是真的?这通常需要什么?
如果是这样,我相信我可以简单地将文件写入1和0的几次.
我读过:http : //www.codeproject.com/KB/files/NShred.aspx http://blogs.computerworld.com/node/5756 http://blogs.computerworld.com/node/5687 安全删除C#.NET中的文件
目标:Marshal C++(指向?)的结构数组到C#.
C++: CreateVertexDeclaration()
HRESULT CreateVertexDeclaration(
[in] const D3DVERTEXELEMENT9 *pVertexElements,
[out, retval] IDirect3DVertexDeclaration9 **ppDecl
);
Run Code Online (Sandbox Code Playgroud)
C#:
我用它来定义D3DVERTEXELEMENT9
结构.SharpDX是一个直接从DirectX SDK C++标头生成的托管DirectX库,因此它可以与COM互操作完全兼容.我实际上已经有10个其他钩子完美地工作了,但这是第一个带有指向结构数组的指针.
为了防止SharpDX的结构定义不起作用,我也尝试用我自己的定义替换它:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class D3DVERTEXELEMENT9
{
public short Stream;
public short Offset;
public DeclarationType Type; // Enum
public DeclarationMethod Method; // Enum
public DeclarationUsage Usage; // Enum
public byte UsageIndex;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下C#方法签名:
注意:IntPtr devicePointer
作为第一个参数应该不是问题.我有10个其他成功工作的钩子.
注意:这些是Direct3D API挂钩.所以我的程序正在传递我需要从非托管C++环境编组到托管C#环境的数据.
1:
CreateVertexDeclaration(IntPtr devicePointer, D3DVERTEXELEMENT9[] vertexElements, out IntPtr vertexDeclaration)
结果:数组有一个元素,但其值是默认值(没有意义).这意味着short Stream
,short …
我创建了一个包含256个字符的文本文件,文本文件的第一个字符是ASCII值0,文本值的最后一个字符是ASCII值255.两者之间的字符均匀地从0到255递增.因此字符#27是ASCII值27.字符#148应该是ASCII值148.
我的目标是阅读此文本文件的每个字符.
我试过读这个cin
.我试过cin.get()
和cin.read()
,这两者都应该读无格式输入.但是在阅读第26个角色时都失败了.我想当我用过时unsigned char
,cin
说它是读书255
,这根本不是真的.当我使用普通签名时char
,cin
表示正在阅读-1
.无论ASCII的等价字符26
是什么,都应该读取.或许cin
认为它受到了打击EOF
?但我之前阅读过单独的StackOverflow帖子,这些帖子EOF
不是一个可以写的实际角色.所以我迷失了为什么cin
咳嗽表示整数-1
或整数的字符值255
.有人可以告诉我我做错了什么,为什么,最好的解决方案是什么,为什么?
粘贴的具体代码不多.我已经尝试了一些不同的非工作组合都涉及要么cin.get()
或cin.read()
与任一char
或unsigned char
和呼叫强制转换为char
和int
之间.我没有运气能够读过第26个角色,除此之外:
unsigned char character;
while ( (character = (unsigned char)cin.get()) != EOF) { ... }
Run Code Online (Sandbox Code Playgroud)
虽然有趣的是,虽然这并没有阻止我在第26个字符的while循环,但它也不会继续前进.看起来cin
,它是否cin.get()
还是cin.read()
只是拒绝前进到下一个字符检测的东西它不喜欢的时刻.我也知道cin.ignore()
存在类似的东西,但我的输入是不可预测的; 也就是说,我的文本文件的这256个字符只是一个测试用例,真正的输入是相当随机的.这是较大的家庭作业的一部分,但这个具体问题与作业无关; 我只是坚持了部分流程.
注意:我正在读取标准输入流,而不是特定的文本文件.似乎仍然没有直接的解决方案.我无法相信以前没有这样做过cin …
我已经使用 cachegrind 在 Linux 上分析了一个计算量很大的 C++ 程序。令人惊讶的是,事实证明我的程序的瓶颈不在于任何排序或计算方法......它在于读取输入。
这是 cachegrind 的屏幕截图,以防我误解分析器结果(请参阅 参考资料scanf()
):
我希望我说的是对的,这scanf()
占用了我 80.92% 的运行时间。
我使用 读取输入cin >> int_variable_here
,如下所示:
std::ios_base::sync_with_stdio (false); // Supposedly makes I/O faster
cin >> NumberOfCities;
cin >> NumberOfOldRoads;
Roads = new Road[NumberOfOldRoads];
for (int i = 0; i < NumberOfOldRoads; i++)
{
int cityA, cityB, length;
cin >> cityA;
//scanf("%d", &cityA); // scanf() and cin are both too slow
cin >> cityB;
//scanf("%d", &cityB);
cin >> length;
//scanf("%d", &length);
Roads[i] …
Run Code Online (Sandbox Code Playgroud) c# ×6
c++ ×3
performance ×2
aes ×1
android ×1
api ×1
architecture ×1
asynchronous ×1
cin ×1
dll ×1
eclipse ×1
flash ×1
hook ×1
java ×1
logcat ×1
marshalling ×1
rest ×1
security ×1
servicestack ×1
sha512 ×1
sharpdx ×1
soa ×1
udp ×1
windows ×1
winforms ×1