我们需要使用第三方ActiveX控件.
唯一的问题是,我们软件中的图层是业务层,无法访问窗口或表单.它还运行在不是STA的单独线程上(并且应该在任何线程中工作).
我们使用此解决方法使其工作,而不是将UI与业务逻辑分开.
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)
然后,只要我们需要引用控件,我们调用_myActiveX.BeginInvoke()
或Invoke()
.
在处理这个类(退出我们的应用程序)时,我们处理控件并中止线程.
我的问题是,这有什么问题吗?有没有更好的方法来处理这个?
在未知的多线程环境中有没有更好的内置方法来使用ActiveX控件?我们试图以包装控件的方式编写我们的类,但是可以在任何线程中工作.
更新:作为一个答案建议,我们真的宁愿使用标准COM对象,而根本不使用控件.我们的问题是我们会在我们调用COM对象的第一个方法或属性上得到错误"(来自HRESULT的异常:0x8000FFFF(E_UNEXPECTED)".这是一个非常一般的错误,我们在使用ActiveX时没有得到这个错误, 有任何想法吗?
更新:我们的ocx是"CX25.ocx",使用tlbimp.exe我们得到CX25Lib.dll.使用aximp.exe,我们得到AxCX25Lib.dll和CX25Lib.dll.在任何一种情况下CX25Lib.dll都不起作用.AxCX25Lib.dll可以使用.
我想过使用观察者或回调.什么时候应该使用观察者?
你可以做以下事情:
# User-model
class User << AR
after_create :send_greeting!
def send_greeting!
UserNotifier.deliver_greeting_message(self)
end
end
#observer
class UserNotifier << AR
def greeting_message(user)
...
end
end
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个观察者并让它在用户创建时观察...
你推荐什么?
我们目前正在使用CruiseControl.NET和NAnt 0.85构建脚本,虽然一切运行良好,但日志文件对我来说有点过于冗长.
特别是,当使用<delete>
任务删除文件夹时,我总是[delete] Deleting directory
在日志中获得一个条目.
足够公平,但这个任务是在一个foreach
循环中运行并导致一个很长的条目列表(特别是如果文件夹包含文件 - 报告每个删除)这只是使日志混乱并使其难以阅读而无需无休止的滚动.我已经添加了许多<echo>
任务来报告脚本进度,所以不需要所有这些'绒毛'.
我已经verbose="false"
在<delete>
任务上使用了该属性,并且在此过程中压缩了文件删除消息(这提高了日志可读性无止境),仍然会报告文件夹删除.我尝试过使用该verbose
属性,foreach
但这没有任何区别.
有谁知道我怎么可以压制这些消息或我坚持他们..?
我在Vista(32位)上使用Eclipse PDT 3.5.虽然eclipse需要管理员权限才能执行,但它确实有效.这让我很烦,但我接受了.
但是:偶尔(我不确定,甚至可能每次我想打开一个项目),我收到错误消息" 我的项目的项目描述文件(.project)丢失了."
它不会丢失,它位于项目的主文件夹中.它没有设置特殊标志(它不是隐藏的,也不是系统文件,也不是写保护的).
这适用于我列表中的所有项目.到目前为止我找到的唯一解决方案是从eclipse中删除项目并重新添加它.这有点烦人.
我能做什么?
编辑:工作区位于服务器卷上.这可能是问题吗?之前我使用过Eclipse 3.3,服务器路径没问题.并且服务器卷映射到驱动器号.
我知道它需要浮动,但结果中各种升压水平的典型值是什么?
例如:
如果我想将文档的权重提高10%,那么我应该将其设置为1.1?20%然后是1.2?
如果我开始将提升设置为75.0之类的值会怎样?还是500.0?
编辑:固定格式
如何获取场景中节点的实际位置.绝对位置,无论任何容器/变换.
例如,我想翻译某个节点,a
以便它暂时与另一个节点重叠b
.所以我希望将他的translateX
财产设置为b.globalX-a.globalX
.
文件说:
定义为了布局而添加到此节点的变换坐标的平移的X坐标.执行布局的容器或组将相对于layoutBounds.minX设置此变量,以便将节点定位在所需的布局位置.
例如,如果孩子的最终位置为finalX:
child.layoutX = finalX - child.layoutBounds.minX;
Run Code Online (Sandbox Code Playgroud)
也就是说,任何节点的最终坐标都应该是
finalX = node.layoutX + node.layoutBounds.minX
Run Code Online (Sandbox Code Playgroud)
但是运行以下代码:
var rect;
Stage {
title: "Application title"
width: 250
height:250
scene: Scene {
content: [
Stack{content:[rect = Rectangle { width:10 height:10}] layoutX:10}
]
}
}
println("finalX = {rect.layoutX+rect.layoutBounds.minX}");
Run Code Online (Sandbox Code Playgroud)
给了我finalX = 0.0
而不是finalX = 10.0
文件看似状态.
有没有一个明确的方法来获得JavaFX中绝对最终的定位坐标?
我正在尝试为F#中绑定到特定泛型类型参数的泛型类型创建各种扩展方法,但该语言似乎不允许我:
我想做的是如下:
type IEnumerable<int> with
member this.foo =
this.ToString()
Run Code Online (Sandbox Code Playgroud)
但它给了我编译器错误(强调int
关键字):
类型名称中的意外标识符.预期的中缀运算符,引号或其他标记.
下面做工作,尽管它没有特异性结合的泛型类型参数int
,因为我想:
type IEnumerable<'a> with
member this.foo =
this.ToString()
Run Code Online (Sandbox Code Playgroud)
有没有办法在F#中实现这个目标 - 我可能只是使用了错误的语法?如果没有,我会很感激,如果有人可以建议一个解决方法,也许在某处使用类型约束.
generics extension-methods f# generic-type-argument type-constraints