小编ta.*_*.is的帖子

打印NSString

在Objective-C中打印NSString的正确方法是什么?很多例子都使用NSLog(),但根据文档:

NSLog是一个FoundationKit函数,用于将调试语句打印到控制台.... NSLog的工作原理基本上如下:fprintf(stderr,format_string,args ...);

对我来说有点像Win32/C++中的_TRACE宏.我不想打印到stderr,我想打印到stdout.有人建议使用printf()如下:

printf("%s", [str cStringUsingEncoding:NSUTF8StringEncoding]);
Run Code Online (Sandbox Code Playgroud)

但这似乎是间接的一个额外的水平,以打印NSString,它并没有"感觉"像解决方案.

objective-c

28
推荐指数
3
解决办法
3万
查看次数

线程同步101

以前我写过一些非常简单的多线程代码,而且我一直都知道在任何时候都可以在我正在做的事情中间进行上下文切换,所以我总是通过以下方式保护访问共享变量一个CCriticalSection类,它进入构造的关键部分并使其破坏.我知道这是相当激进的,我进入和离开关键部分非常频繁,有时非常惊人(例如,当我可以将CCriticalSection置于更严格的代码块中时,在函数的开头)但我的代码没有崩溃并且运行得足够快.

在工作中,我的多线程代码需要更紧密,只需要在最低级别锁定/同步.

在工作中我试图调试一些多线程代码,我遇到了这个:

EnterCriticalSection(&m_Crit4);
m_bSomeVariable = true;
LeaveCriticalSection(&m_Crit4);
Run Code Online (Sandbox Code Playgroud)

现在,m_bSomeVariable是Win32 BOOL(非易失性),据我所知,它被定义为一个int,并且在x86上读取和写入这些值是一条指令,并且因为上下文切换发生在指令边界上,所以没有必要用于将此操作与关键部分同步.

我在网上做了一些更多的研究,看看这个操作是否不需要同步,我想出了两个场景:

  1. CPU实现无序执行或第二个线程在不同的内核上运行,更新后的值不会写入RAM以供其他内核查看; 和
  2. int不是4字节对齐的.

我相信使用"volatile"关键字可以解决数字1.在VS2005及更高版本中,C++编译器使用内存屏障围绕对此变量的访问,确保在使用变量之前始终将变量完全写入/读取到主系统内存.

2号我无法验证,我不知道为什么字节对齐会产生影响.我不知道x86指令集,但是mov需要给出一个4字节对齐的地址吗?如果不是,您需要使用指令组合吗?这会引入问题.

所以...

问题1:使用"volatile"关键字(隐含使用内存屏障并暗示编译器不优化此代码)可以避免程序员在读取/读取x86/x64变量之间同步4字节/ 8字节的需要写操作?

问题2:是否明确要求变量为4字节/ 8字节对齐?

我做了一些深入研究我们的代码和类中定义的变量:

class CExample
{

private:

    CRITICAL_SECTION m_Crit1; // Protects variable a
    CRITICAL_SECTION m_Crit2; // Protects variable b
    CRITICAL_SECTION m_Crit3; // Protects variable c
    CRITICAL_SECTION m_Crit4; // Protects variable d

    // ...

};
Run Code Online (Sandbox Code Playgroud)

现在,对我来说这似乎过分了.我认为关键部分在一个进程之间同步线程,所以如果你有一个,你可以输入它,并且该进程中没有其他线程可以执行.对于要保护的每个变量,不需要关键部分,如果您处于关键部分,那么没有其他任何内容可以打断您.

我认为唯一可以从关键部分外部更改变量的是,如果进程与另一个进程共享一个内存页面(你可以这样做吗?),另一个进程开始更改值.互斥体在这里也有帮助,命名互斥体是跨进程共享的,还是只有同名的进程共享?

问题3:我对关键部分的分析是否正确,是否应该重写此代码以使用互斥锁?我看过其他同步对象(信号量和自旋锁),它们更适合这里吗?

问题4:关键部分/互斥体/信号量/自旋锁哪里最适合?也就是说,它们应该应用于哪个同步问题.选择一个而不是另一个会有很大的性能损失吗?

虽然我们正在研究它,但我读到自旋锁不应该用在单核多线程环境中,只能用于多核多线程环境.所以,问题5:这是错的,或者如果不是,为什么是对的?

在此先感谢任何回复:)

c++ multithreading mutex volatile memory-barriers

18
推荐指数
4
解决办法
2289
查看次数

TCP包上"不碎片"的好处?

我们的一位客户在将数据从我们的应用程序(在他们的PC上)提交到服务器(不同的地理位置)时遇到了问题.当发送1100字节以下的数据包时,一切正常,但在此之上我们看到TCP每隔几秒重新传输一次数据包并且没有响应.我们用于测试的数据包大约是1400字节(但小于1472).我可以向www.google.com发送一个1472字节的ICMP ping并获得响应(因此它不是他们的路由器/前几个跃点).

我发现我们的应用程序为这些数据包设置了DF标志,我相信一路上到服务器的路由器的MTU小于/等于1100并且丢弃了数据包.

这影响了5000个中的1个客户端,但由于每个人的路由都不同,这是预期的.

数据是SOAP信封,我们期望回复SOAP响应.我无法证明为什么我们这样做,执行此操作的代码是由以前的开发人员编写的.

那么...... 对于应用程序数据,在TCP数据包上设置DF标志是否有任何好处或理由?

我可以想到网络诊断应用程序需要的原因,但在我们的情况下却没有(我们希望数据到达端点,是否碎片化).我们的一个系统管理员说它可能与我们使用SSL有关,但据我所知,SSL就像一个流而不管碎片,只要流在最后重建,就没有问题.

如果没有充分的理由,我将改变我们的应用程序的行为.

提前致谢.

ssl soap tcp fragmentation packet

17
推荐指数
1
解决办法
3万
查看次数

传统报告的升级路径("嵌入式"Access 2003)?

更新:Albert D. Kallal友好地开始讨论,并获得更多意见,我正在增加赏金.

这是一个关于自己维护遗留应用程序和其他两个开发人员支持的重要问题.我们不是最初的开发人员,代码库是300,000行MFC和业务逻辑紧密耦合在一起.我们不知道100%的每一行代码.

我们知道主要组件背后的代码,并且我们知道它编写得很糟糕.我们的目标是在1995年之前和2010年之前重构应用程序.在我们三个人之间(总计)有足够的软件架构和数据库设计经验,以便我们修复在代码中构造不良或在模型中错误建模的组件.数据库,但我们没有很多现代报告系统的经验.因此,我的问题(一旦你到达终点......)就是报告系统.

对于任何读完这篇文章的人,我都很感激你的时间.对于任何阅读这篇文章并回答解决方案,经验(或同情!)的人,我都很感激和感激.

在工作中,我继承了Access 2003数据库的维护,该数据库包含大约250个报告(以及数千个支持查询),作为我们应用程序的报告引擎.

报告中都有大量的VBA用于特定格式化或将额外信息提取到报告中.出于这个原因,我们完全被锁定在Access平台中,我们不能使用像BIDS这样的工具来导入Access报表对象,而不会搞乱使报表在没有VBA的情况下显示相同.

因此,为了让自己摆脱这种Access解决方案,我们需要花一些时间来审阅每一份报告.这意味着我们希望选择最好的长期解决方案,因为无论我们选择哪个平台,我们都必须重新开发每个报告.

此外,我们的客户可以选择Microsoft Access或SQL Server作为其数据库.这意味着我们所有的SQL都必须考虑到最低的公分母--JET SQL.我们有一些摆脱空间来放弃对Microsoft Access的支持,但我们需要为它构建一个案例.如果我们可以识别的最佳报告系统对SQL Server有很强的支持,但很少或不支持Microsoft Access,这将加速我们放弃对Microsoft Access作为数据库的支持.

报告系统的整体实现相当平庸,当我们想要在我们的应用程序中显示报告时,我们启动Microsoft Access进程,找到它的窗口并将其重新显示到我们的应用程序,剥离其窗口样式,然后使用Access.ApplicationCOM接口调用一些VBA创建链接表到数据库(Microsoft Access MDB或SQL Server数据库),然后打开我们想要的报表.可能该过程中唯一受支持的部分是使用公共COM接口,其余部分是丑陋的黑客.应用程序中的其他组件同样令人印象深刻.

为了"修复"我们的应用程序,我们有了一个新的开发计划,我们的应用程序开发每年分成(大约)三个部分.

  1. 4个月升级我们的申请,以支持我们行业的最新政府立法
  2. 4个月提供新的主要功能
  3. 4个月"整合"(修复坏了)

我们目前处于第3位(今年),我们真的希望利用停机时间来修复应用程序,重构主要组件.我们有三个开发人员,并希望在2012年底推出AppName v5.0(目前是AppName v4.12).这为我们提供了36个月的开发工作,以便在我们之前的三个合并期间对几个组件(用户界面,底层数据库结构,报告等)进行比较.我们修复的组件总和将为我们提供v5.0.

除了我们的报告引擎之外,我们已经确定了我们想要对大多数组件做什么,并且我发布了SO以期获得一些好的想法,或者至少感觉到所需的工作.

我有两个改进报告系统的想法.它们都涉及适量的工作,并且有一个考虑因素,两个解决方案都没有完全解决:除了我们开发的报告之外,我们的客户还有机会请求定制开发报告.它们是特定于客户的,我们使用他们的Access数据库,使用他们的报告对其进行扩充并将其返回给客户.有数百个独特的报告 - 如果我们关闭旧系统就无法使用.(我们最终必须关闭旧系统 - 我们不知道我们能够多长时间使用Microsoft Access窗口使其看起来像嵌入式报告.我们已经有两个不同的代码Access 2003和2007的路径.如果我们可以'

对于这两种想法,目的是停止支持我们当前的报告系统,让它在没有维护的情况下运行.也许我们可以破解Access 2010和Access 2014支持,并且开发的客户报告继续推出5年以上.随着时间的推移,我们会将旧的Access数据库中最常用的报告迁移到新格式中.

想法1: Microsoft.Reporting.WinForms.ReportViewer

第一个想法是在ReportViewer控件周围编写一个包装器作为替换报告引擎.

我们需要将项目移动到C++/CLI(已经在卡上),而不是每次我们需要查看报告时都必须启动整个过程,我们可以简单地实例化该控件.这是一个额外的好处RDLC,包含报告的文件在Subversion中比我们当前拥有的Access 2003数据库更容易进行版本控制(我们使用Visual SourceSafe,因为将SVN与Access集成的工具与我们的大小不一致访问数据库).RDLC文件的可视化设计器也很好地集成到Visual Studio中.

这更像是对我们报告方式的进化而非革命性的改变,ReportViewer控件将采用RDLC具有报告布局的文件,我们的应用程序将负责查询数据.因为我们的数据库可能是SQL Server或Microsoft Access,所以我们仍然需要编写简单的JET SQL.我们正在获得更好的报告(向下钻取看起来不错),更强大的创作工具和更简单的版本控制,但这是值得的吗?

想法2:SQL Server Reporting Services和带有Access Services的SharePoint 2010

第二个想法是将Access作为数据库平台杀死并将我们所有客户迁移到SQL Server(我们已经为没有设置自己的SQL Server实例的技能的客户托管了我们的应用程序实例).迁移后,我们将使用SQL Server Reporting Services作为报告引擎,ReportViewer …

c++ sql-server sharepoint ms-access c++-cli

6
推荐指数
1
解决办法
455
查看次数

网络的大多数便携式视频编解码器?

我正在寻找一种方法,可以在不使用Flash或Silverlight等插件的情况下在网页中嵌入视频.理想情况下,我能够<embed src="movie.ext">并期望在大多数浏览器中都能使用它.

我的目标是将视频编码为适用于IE7及更高版本,Chrome和Firefox的格式.但我需要知道哪种编解码器最便携.

不幸的是,需要支持IE7排除HTML5视频支持.

video html4 codec

3
推荐指数
1
解决办法
606
查看次数

操作数据库模式到数据集市模式,表减少?

我开始学习SQL Server Analysis Services,我正在通过培训书以及开发人员培训工具包.在这两者中,我发现建议OLAP数据库中使用的表数(理想情况下,星型模式)从生产OLTP数据库中大大减少.

从培训套件中:

我们遵循数据维度方法来构建数据集市架构.在操作数据库中的大约200个表中,数据集市模式包含大约10个维度表和2个事实表.

据我所知,操作数据库通常(有些)规范化,数据集市模式严重非规范化.我还认为,非规范化数据通常涉及添加更多表,而不是更少.

除非您只需要报告数据子集,否则我无法看到如何从200个表转到12个表.如果您只需要报告数据的子集,为什么不能在操作数据库中使用适当的表(除非使用非规范化的星型模式可以获得显着的性能提升)?

olap ssas business-intelligence

-1
推荐指数
1
解决办法
731
查看次数