最近几天因为工作生病而厌倦了我的大脑,我决定尝试挖掘一些旧代码.我可以找到一些我写过的古代Atari ST的二进制版本,但我找不到任何来源.我确实设法挖掘了一个旧的ModeX库,这个库是我在很久以前从传奇的旧x2ftp站点的存档中编写的.
http://ftp.lanet.lv/ftp/mirror/x2ftp/msdos
爆炸从过去:-)
; Actually Sticks Us Into ModeX - With 240 Scanlines Per Page
; Set The Variable LSCAN To The Virtual Scanline Length You Want
; Trashes AX, CX, DX, DS, SI
; Shouldn't Matter Though As This Should Be The First Thing You Call!
Set_X_240 PROC
Call Set_Graph ; Set Mode 13h
mov dx, Seq_Port
mov ax, 00604h ; Index 4 (Memory Mode Reg.) In AL
; Bit 3 = Chain 4
out dx, ax ; …Run Code Online (Sandbox Code Playgroud) 我被分配到多线程java服务器的一些性能和随机崩溃问题.尽管线程和线程安全对我来说并不是真正的新主题,但我发现设计一个新的多线程应用程序可能比尝试调整一些遗留代码困难一半.我浏览了一些着名的书籍以寻找答案,但奇怪的是,只要我阅读并分析所提供的例子,一切看起来都很清楚.然而,第二个我看看我应该工作的代码,我不再确定任何事情!必须是太多的理论知识和一些现实世界的经验或其他东西.
无论如何,回到主题,因为我正在做一些在线研究,我遇到了这段代码.一直困扰着我的问题是:在没有同步的情况下从两个独立的线程调用套接字上的getInputStream()和getOutputStream()是否真的安全?或者我现在对整个线程安全问题有点过于偏执?猜猜这就像连续第5本书中的内容一样,告诉你有多少东西可能出现并发问题.
PS.对不起,如果这个问题有点冗长或者说'noobie',请放轻松 - 这是我在这里的第一篇文章.
编辑:为了清楚起见,我知道套接字在全双工模式下工作,并且可以安全地同时使用它们的输入和输出流.当您在主线程中获取这些引用然后使用这些引用初始化线程对象时,我似乎很好,但是在两个不同的线程中获取这些流也是安全的吗?
@rsp:
所以我检查了Sun的代码,然后PlainSocketImpl就这两种方法进行同步,就像你说的那样.Socket但是,没有.getInputStream()并且getOutputStream()几乎只是包装器SocketImpl,所以可能并发问题不会导致整个服务器爆炸.但是,有一些不幸的时机,似乎事情可能会出错(例如,当方法已经检查错误条件时,某些其他线程关闭套接字).
正如您所指出的,从代码结构的角度来看,为每个线程提供流引用而不是整个套接字是个好主意.我可能已经重构了我正在处理的代码,如果不是因为每个线程也使用套接字的close()方法(例如当套接字接收"shutdown"命令时).据我所知,这些线程的主要目的是将消息排队以便发送或处理,因此可能是单一责任原则违规,并且这些线程不能关闭套接字(与分离的调制解调器接口相比) ?但是如果我长时间分析代码,看起来设计通常是有缺陷的,整个过程需要重写.即使管理层愿意付出代价,认真重构遗留代码,没有任何单元测试以及处理难以调试的并发问题,也可能弊大于利.不是吗?
那么,在你问"你的意思是什么之后,一个嵌套在另一个之内?" 我会尽可能简单地解释一下.
存在.NET Web应用程序(A).构建了一个补充应用程序(B),它可以处理几个相同的核心组件.之前的一家咨询公司以某种方式在应用程序A中"安装"了应用程序B ,以便B可以背负A的会话.所以,像这样:
- Application A (C:\Inetpub\wwwroot\ApplicationA)
+ Application B (C:\Inetpub\wwwroot\ApplicationA\sup\ApplicationB
Run Code Online (Sandbox Code Playgroud)
之前的公司没有留下关于他们如何或为什么这样做的文档,但它对他们有用.我现在面临的困境是:应用程序A升级,使B无用.我更新了B来运行A提供的新核心,但是当我完成时,另一个团队已经摧毁了之前的生产和测试服务器,我无法获得备份以查看它是如何配置的.
经过一系列的改进后,我能够通过切断B的web.config文件并删除重复的部分 - 在A的web.config中已存在的部分,在单个IIS应用程序和池中复制上面的层次结构.我还将B的bin文件夹中的所有文件转储到A的bin文件夹中.
两个站点都编译并由IIS提供服务,但我无法使用此结构从A的会话中读取任何内容.我对这个结果并不感到惊讶,但我需要找到一个解决方法.简而言之,A有一个存储在其会话中的sessionID,我需要用它来获取B中的数据源,因为A的创建者施加了一些疯狂的许可规则(sessionID需要传递给其核心API中的每个函数)用户授权).
关于为什么功能不再有效的任何想法(假设我已经正确地复制了旧环境),或者我如何解决它?移动到SQL服务器以获取会话状态不是一个选项 - 我无法更改有关应用程序A的任何内容.
我看了一下A的代码(就像我敢用Reflector一样),我试图从会话中检索的变量仍在那里并被使用.
任何想法都会很棒!
我正在刷新一些旧的代码(其他人写的),并且遇到了这个:
if ( empty ( $role_data["role_id" == 1]))
Run Code Online (Sandbox Code Playgroud)
是什么原因(如果有的话)使用上述而不是?:
if ( $role_data["role_id"] != 1)
Run Code Online (Sandbox Code Playgroud)
IMO可读性更差,而且代码更多.性能不是这里的一个因素.
- 编辑 -
我应该提一下,预期的输入($ role_data ["role_id"])是0-5之间的数字(含) -
更多信息 -
我第一次想念这段代码.但这是发生了什么:
$role_id = htmlspecialchars ( mysql_real_escape_string ( $_GET["role_id"] ) );
$role_data = $db->fctSelectData ( "core_role" , "`role_id` = '" . $role_id . "'" );
Run Code Online (Sandbox Code Playgroud)
这将获得创建角色的权限.但是如果首先给出一个无效$role_id的(通过$ _GET参数),它将不返回任何内容,因此在以下位置检查空值:
if ( empty ( $role_data["role_id" == 1] ) )
Run Code Online (Sandbox Code Playgroud)
我还不完全清楚它为什么这样写
我正在将一些旧的旧版 VB 应用程序从 .NET 框架转换为 .NET 5,并且已经解决了大部分问题,但是,我迷失了这些:
Error BC30002 Type 'Global.Microsoft.VisualBasic.ApplicationServices.ApplicationBase' is not defined.
Error BC30002 Type 'Global.Microsoft.VisualBasic.ApplicationServices.User' is not defined.
Error BC30002 Type 'Global.Microsoft.VisualBasic.Devices.Computer' is not defined.
Error BC30002 Type 'Global.Microsoft.VisualBasic.MyServices.Internal.ContextValue' is not defined.
Run Code Online (Sandbox Code Playgroud)
VisualBasic 10.3.0 包包含在项目中。
任何提示表示赞赏。
谢谢,比尔
我有一个Visual Studio 2005 C++项目,它是一个控制台应用程序.
我想开始在测试工具下获取一些代码,但我遇到了一些我不知道如何最好地处理的问题.
我不希望我的大多数测试代码最终都在生产中的普通.exe中,所以我认为最好为我的测试创建一个单独的项目.第一个问题,这个新项目将如何调用其余的代码?我是否应该使用单个入口点将遗留代码设为.lib或.dll,并创建一个单独的项目来调用遗留代码的主要内容?
我是否应该把所有测试放在完全不#ifdef TESTING使代码不会出现在我的生产.exe 文件中的丑陋黑客?如果是这样,我应该如何有条件地加载我的测试框架?使用单独的属性配置进行测试?
我基本上正在寻找有关如何在Visual C++中获取遗留.exe项目的测试工具的任何建议
我支持用Delphi 3编写的应用程序,我想在等待有机会将其升级到更新版本的Delphi时对源代码进行一些改进.我想要使用的一件事是Interfaces.我知道Delphi 3已经有了Interfaces的概念,但是我很难找到如何做等效的
if Supports(ObjectInstance, IMyInterface) then
Run Code Online (Sandbox Code Playgroud) 我只是移植了一些旧代码:
#define NewArrayOnHeap(TYPE, COUNT, HEAP, NEWPTR, ERROR) \
((*(NEWPTR) = new ( #TYPE "[" #COUNT "]", __alignof(TYPE), (HEAP), &hr, (ERROR)) TYPE[COUNT] ), hr)
Run Code Online (Sandbox Code Playgroud)
看起来原版应该定义他们自己的魔法new操作符.我很好奇这种用法.
int main()
{
void* heap = /* Don't know how to define this */
double* ptr;
HRESULT hr;
hr = NewArrayOnHeap(double, 10, heap, ptr, "Help /* Just guessing here */");
}
Run Code Online (Sandbox Code Playgroud)
当我g++ -E用来获取预处理器输出时,它是:
int main()
{
double* ptr;
HRESULT hr;
hr = ((*(ptr) = new ( "double[ 10 ]", __alignof(double), (NULL), …Run Code Online (Sandbox Code Playgroud) 我被指派维护一堆遗留应用程序,这些应用程序在05年之前没有ORM时构建了大量的存储过程.与我合作的开发人员不了解实体框架,也不了解LINQ,也不急于学习.
.NET上是否有任何ORM为现有数据库表和存储过程提供简单的对象接口?
我很高兴它能让我编写几行来为每个表获取一个类,并且它具有与每列中的数据相对应的属性以及一些解决外键关系/多对多关系的方法或属性 - 转发并反转.
例如,保存一个员工和部门记录
Employee e = new Employee("John", null);
Department d = new Department("QA");
d.save();
e.department = d;
e.save();
Run Code Online (Sandbox Code Playgroud)
无需编写INSERT SQL语句.
编辑:我正在使用MS SQL Server 2008
我继承了一个巨大的c ++代码库和一些集成测试.这是一个将数据提供给许多下游系统的关键系统.由于测试非常不可靠,我们的团队无法自信地推动变革.
我们想在系统中引入一些测试,但大多数开发人员都有Java背景.我们有什么选择?
1)学习C++
2)使用JNI:不确定它有多容易
legacy-code ×10
.net ×2
c++ ×2
java ×2
.net-5 ×1
68000 ×1
asp.net ×1
assembly ×1
c# ×1
database ×1
delphi ×1
delphi-3 ×1
if-statement ×1
iis-6 ×1
new-operator ×1
oop ×1
orm ×1
php ×1
session ×1
sockets ×1
unit-testing ×1
vb.net ×1
visual-c++ ×1