在Delphi 2009和Windows API中,有没有办法检测特定代码段是否在辅助线程的上下文中运行?在伪代码中,我想能够说:
procedure DoSomething;
begin
if InvokedBySecondaryThread then
DoIt_ThreadSafeWay
else
DoIt_RegularWay;
end;
Run Code Online (Sandbox Code Playgroud)
这是我编写并已使用多年的日志库,现在我正在尝试适应可以从多个线程调用一个过程的情况.我的"常规方式"不是线程安全的.我知道如何使它线程安全,但我只想在实际需要时使用线程安全方法.
解释(不是必读的:-)
它归结为使用SendMessage和PostMessage将记录的消息分派给多个接收器(例如日志文件,控制台或VCL控件)之间的选择.使用PostMessage意味着在长时间阻塞操作正在进行时将不会收到消息,这有点违背了记录的目的,尤其是.用来表示进度.我想我可以用一个关键部分来保护SendMessage调用,但我再次希望只有在真正需要时才能这样做.
我知道system.pas中的全局变量IsMultiThread,但这只会告诉我应用程序已经启动了辅助线程.这些可能是由第三方库创建的线程,因此它们永远不会访问"我的"代码,因此它们的存在不会影响我的日志记录逻辑.
我真的希望我可以使用相同的低级库代码,无论它是从一个还是多个线程调用.例如,从辅助线程内部调用修改的线程安全日志记录过程很容易,但这会复制很多代码,我仍然要记住要做正确的事情.
@Lieven:目前,日志逻辑就像这样,有点简化了
我希望日志记录尽可能轻松,使用最少的设置代码并且不必担心管理对象生存期,因此库只暴露了许多重载的帮助程序,例如
procedure Log( const msgText : string; level : TLogLevel = lvNotice ); overload;
procedure Log( const msgText : string; Args : array of const; level : TLogLevel = lvNotice ); overload;
etc, including specialized routines that log a StringList, a boolean, an Exception and so on
Run Code Online (Sandbox Code Playgroud)
几乎所有其他事情都发生在单位的实施中.所有帮助程序最终都会调用
procedure _LogPostMessage( const msgText : string; level : TLogLevel );
Run Code Online (Sandbox Code Playgroud)
其中(a)检查单例调度程序对象是否已初始化; …
考虑以下VC++ 10.0代码中的两个lambda函数:
template <typename T>
void eq(uint fieldno, T value) {
table* index_table = db.get_index_table(fieldno);
if (index_table == nullptr) return;
std::set<uint> recs;
index_table->scan_index<T>(value, [&](uint recno, T n)->bool {
if (n != value) return false;
recs.insert(recno);
return true;
});
add_scalar_hits(fieldno, recs).is_hit =
[=](tools::wsdb::field_instance_t& inst) {
return boost::get<T>(inst) == value;
};
}
Run Code Online (Sandbox Code Playgroud)
在第一个lambda函数中,我被迫使用->bool返回类型规范,而在第二个lambda中,编译器非常乐意推断返回类型.
我的问题是:编译器何时能推断出lambda的返回类型?只有当你有一个简单的单行时?
我是BDD的全新手,我想了解它在开发周期中的作用.在TDD方法中,我们通常会为库或apis编写单元测试,我们会模拟对象,这很好,因为它甚至可以驱动我们的设计.这些测试将在实际代码之前编写,这很好.
我知道BDD更多的是关于规范/场景测试,我可以看到它非常适合根据实际代码测试业务需求.但是编写这些测试的最佳实践是什么?我们是否仍然继续编写单独的测试(如在TDD中)模拟出依赖关系并为可能出错的每一件事编写单元测试?然后写我们的bdd测试?我们首先编写bdd测试吗?我们是否只针对单个组件编写bdd测试?
我使用.NET并且通常编写asp.net mvc应用程序,但这更像是一个理论问题而且独立于底层编程语言.
非常感谢.
我有一个超过100行的表.
每行包含pdf文件及其最后一个STATUS的描述.
状态显示pdf文件是否可读.
一旦在浏览器中加载了表,我就会从表的每一行创建每个文件名,并使用ajax调用对其进行处理.如果文件是可读的,我将该行的状态字段更新为READABLE.处理每个pdf文件需要30秒到1分钟(取决于文件的大小)
我不想使用异步调用并将所有100个请求发送到我的服务器togather.
当我使用async = false时.它逐个执行每个ajax调用,这就是我想要做的,但同时它会阻止用户浏览已加载的表.换句话说,用户有点卡住,直到所有这些ajax请求都完成了.然后他可以向下滚动阅读更多信息.
我想允许用户在后台阅读网页我想一个接一个地执行ajax请求来处理pdf文件并在每一行中更新它的状态.
我怎样才能做到这一点.
$('table.tableRecods tr').each(function(){
fileWithPath = $('#filePath').text();
$this = $(this);
$this.find('td.status img.cropStatus').attr('src', 'img/loader.gif') ;
$.ajax({
url:'jsonCall.php',
async:false,
data: {file: escape(fileWithPath)},
success: function(data){
if(data.status == 'true') {
$this.find('td.status img.readStatus').attr('src', 'img/icons/read.png') ;
}else if(data.status == 'false'){
$this.find('td.status img.readStatus').attr('src', 'img/icons/__read.png') ;
}
}
});
});
Run Code Online (Sandbox Code Playgroud) 我有两个.NET程序集注册为COM +组件,我正在从常规控制台应用程序测试工具中测试它们;
Dim objFirst As New MyFirstComponent() 'COM+ initialisation
Dim RC As Boolean = objFirst.GetValue()
Run Code Online (Sandbox Code Playgroud)
方法调用成功执行.这是MyFirstComponent的定义;
<ProgId("MyFirstComponent")> _
<Guid("...")> _
<ClassInterface(ClassInterfaceType.None)> _
<Transaction(TransactionOption.Supported)> _
Public Class MyFirstComponent
Inherits ServicedComponent
Implements IMyFirstComponent
Public Function GetValue() As Boolean Implements IMyFirstComponent.GetValue
Dim objSecond As New MySecondComponent() 'COM+ initialisation
Dim RC As Boolean = objSecond.GetValue()
Return RC
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
在MySecondComponent初始化的时候,我得到一个带有以下消息的RemotingException;
无法加载类型'MySecondComponent',...,Version = ...,Culture = neutral,PublicKeyToken = ...'
所有程序集也都有很强的名称.我无法弄清楚为什么我可以成功触发对第一个组件的方法调用,但是当它试图随后加载第二个组件本身时,它无法解析该类型.
作为旁注,如果我在测试工具中运行"GetValue()"主体的代码,它会按预期执行.一旦事情进入调用其他COM +组件的COM +组件领域,问题似乎才会出现.
更新
我想我现在正在缩小这个问题.似乎COM +正在持续进行某些操作,我必须在运行客户端之前从组件服务窗口手动关闭COM +应用程序.之前的问题是我每次更改内容时都在测试客户端(比如将程序集添加到GAC),并且出于某种原因,COM +仍然认为无法找到程序集.关闭应用程序,将所需的程序集添加到GAC并再次运行客户端按预期工作.
这对我的小概念证明客户端来说很好.所以我回到我的真实代码并试了一下,但现在我又遇到了另一个奇怪的问题.我的COM +应用程序似乎无法找到他们正常的项目引用.我真的不想继续添加他们引用GAC的一切,所以我现在试图找出为什么我的普通,非COM +引用没有得到解决.
运行此命令:
CREATE ASSEMBLY
[System.Web] from
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\system.web.dll'
with permission_set = UNSAFE
Run Code Online (Sandbox Code Playgroud)
给我这个错误:
消息10300,级别16,状态2,第1行
程序集"System.Web"引用程序集"system.web,version = 2.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a.",它在当前数据库中不存在.SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:版本,区域性或公钥不匹配).请将引用的程序集加载到当前数据库中,然后重试您的请求.
......这听起来有点傻.看起来SQL Server认为System.Web程序集正在引用它自己.我怎样才能解决这个问题?
题
当我运行所有JUnit测试时,使用eclipse,我可以设置默认超时吗?
背景
我的经理坚持编写单元测试,有时需要5分钟才能完成.当我尝试运行我们的整个测试套件(仅约300次测试)时,可能需要30多分钟.我想放置一些可以阻止任何超过10秒的测试的东西.
我知道个别测试可以注释:
@Test(timeout=10000)
Run Code Online (Sandbox Code Playgroud)
但这样做会使他的长期测试总是失败.我希望他们在他的盒子上运行时工作(如果我必须在检查之前对项目进行微调,那是可以接受的.但是,从40个不同的测试文件中删除超时是不切实际的).
我也知道我可以创建一个ant任务来为所有测试设置默认超时,类似于:
<junit timeout="10000">
...
</junit>
Run Code Online (Sandbox Code Playgroud)
问题是我们通常使用右键单击>运行方式> JUnit测试从Eclipse中运行测试.
摘要
那么是否有一种相对无痛的方法为所有测试设置超时,可能使用运行配置设置,项目设置,或JUnit首选项,或环境变量,或什么?我甚至决定安装一些其他插件,让我右键单击特定的测试文件夹,并以其他方式运行所有测试,如通过蚂蚁或其他东西......
我需要找到我在R中绘制的图的二次方程项.当我在excel中执行此操作时,该术语出现在图表上的文本框中,但我不确定如何将其移动到单元格以供后续使用(应用于需要校准的值)或者实际上如何在R中请求它.如果它在R中可以被召唤,它是否可以作为一个对象来进行以后的计算?
这似乎应该是R中的直接请求,但我找不到任何类似的问题.非常感谢任何人可以提供的任何帮助.
我正在开发一个应用程序,允许用户自己创建查询以查看其数据库中的数据.但是,规定是应用程序应该阻止对数据库中存储的表和数据进行任何修改.应用程序将使用C#编写.如何做到这一点的任何好建议?我想到的可能的想法:
任何建议阻止从此应用程序所做的任何更改,以防止任何用户错误或尝试修改数据表的可能性非常感谢.
我正在为Windows Phone 7创建一个多人游戏.如何运行模拟器的多个实例以进行调试?